2016-09-21 5 views
3

Я использую этот вид сопоставления (ну, это краткая версия, чтобы упростить вопрос) в отношении child-parent, где item является родителем и user_items это дети.Первый запрос Elasticsearch медленный, остальные из них быстрые

curl -XPUT 'localhost:9200/myindex?pretty=true' -d '{ 
    "mappings": { 
    "items": { 
     "dynamic": "strict", 
     "properties" : { 
      "title" : { "type": "string" }, 
      "body" : { "type": "string" }, 
}}, 
    "user_items": { 
     "dynamic": "strict", 
     "_parent": {"type": "items" }, 
     "properties" : { 
      "user_id" : { "type": "integer" }, 
      "source_id" : { "type": "integer" }, 
}}}}' 

И тип запроса я обычно делаю:

curl -XGET 'localhost:9200/myindex/items/_search?pretty=true' -d '{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "query_string": { 
        "fields": ["title", "body"], 
        "query": "mercado" 
       } 
      }, 
      { 
       "has_child": { 
        "type": "user_items", 
        "query": { 
        "term": { 
         "user_id": 655 
    }}}}]}}}' 

В этом запросе он должен искать на полях title и body Строка mercado на данный user_id, в этом случае 655.

Я читал, что причиной столь медленного первого запроса является то, что он кэшируется, а остальные запросы выполняются быстро, поскольку он работает с кэшированным контентом.

я прочитал, я могу сделать первый запрос быстрее, используя eager для предварительной загрузки мои данные (с помощью "loading" : "eager", верно?), Но я не знаю, что я имею в поджать. Должен ли я использовать earger на title и body следующим образом?

{ 
    "mappings": { 
    "items": { 
     "dynamic": "strict", 
     "properties" : { 
      "title" : { "type": "string" , 
         "fielddata": { 
          "loading" : "eager"}}, 
      "body" : { "type": "string", 
         "fielddata": { 
          "loading" : "eager"}}, 
}}, 
    "user_items": { 
     "dynamic": "strict", 
     "_parent": {"type": "items" }, 
     "properties" : { 
      "user_id" : { "type": "integer" }, 
      "source_id" : { "type": "integer" }, 
}}}}' 

Любые другие рекомендации по ускорению/сохранению первого запроса приветствуются. Заранее спасибо

PS: Я использую ES 2.3.2 под машиной Linux, и у меня в общей сложности 25.396.369 документов.

+0

Какая версия ES вы используете? – Val

+0

Вы можете использовать нагреватели, но сначала убедитесь, что он не заменяет. На какой ОС вы работаете ES? – AndreKR

+0

@Val 2.3.2 и я использую Linux. –

ответ

2

Просто фиксируется один и тот же вопрос. Предварительная загрузка полей была ключевой. Погрешность индекса была устарела, и по умолчанию значение doc_values ​​включено. Мое приложение искало пару полей по большому индексу (100G +) и было медленным, мне пришлось перестроить индекс с загрузкой = нетерпением для всех полей, которые я искал. Это предварительно загружает его и вызывает довольно длительный запуск, но после этого поиск пошел от начального 10 секунд (< 400 мс впоследствии) до < 900ms начального поиска (< 400 мс впоследствии).Сделать картографирование и реимпортировать данные

PUT localhost:9200/newindex/ 
{ 
    "mappings": { 
    "items": { 
     "properties": { 
     "title": { 
      "type": "string", 
      "fielddata": { 
      "loading" : "eager" 
      } 
     }, 
     "body": { 
      "type": "string", 
      "fielddata": { 
      "loading" : "eager" 
      } 
     } 
     } 
    } 
    } 
} 
3

Есть три вещи, которые вы можете сделать.

  1. Используйте поле данных загружать при старте Для того, чтобы поджать использование данных поля следующий фрагмент в отображении

    "fielddata": { "загрузка": "готов" } Подробнее here

  2. Использование подогревателя индексов Подогреватели индексов - это определенные запросы, которые вы можете настроить whi ch будет запускаться автоматически при обновлении индекса. This ссылка содержит подробную информацию о том, как настроить теплее.

  3. Использование doc_values ​​ значение Doc является структурой данных на диске, встроенную в момент времени индексного документа, который делает данные модели доступа возможные для агрегации и сортировок возможно. Найти более подробную информацию here

+0

Я уже читал документы. Я прошу решения для моей точной проблемы. –

+1

Вы пробовали делать user_id и исходный идентификатор также в качестве полевых данных? Если это не сработает, попробуйте использовать doc_values, вы можете включить его, сделав '' doc_values ​​": false' для каждого свойства. У меня была аналогичная проблема, которую мы решили с помощью doc_values. первый запрос для нас используется довольно медленно. –

+0

Теперь нагреватель индекса устарел, так как есть большое улучшение индексации v5.x –

Смежные вопросы