2016-10-19 1 views
1

Я использую этот вид сопоставления (ну, это краткая версия, чтобы упростить вопрос) по отношению child-parent, где item - это parent и user_items - children.Elasticsearch 1-й запрос медленный, даже если я использую «loading: eager»

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.

Первый из этих запросов является медленным, это может занять до 15 секунд. Следующие довольно быстрые (< 0,5 сек)

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

Я читаю, что могу использовать "loading" : "eager" для увеличения первого запроса. Таким образом, я создал новое отображение на новый индекс с именем myindex_new

{ 
     "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" }, 
    }}}}' 

... и переиндексирован все следующим образом:

curl -XPOST 'localhost:9200/_reindex' -d '{ 
    "source" : { 
     "index" : "myindex" 
    }, 
    "dest" : { 
     "index" : "myindex_new" 
    } 
}' 

Дело в том, что я не получаю никаких лучших результатов. Первый запрос все еще медленный, если я запрошу новый индекс с помощью eager. Я также попытался добавить eager в дочерние поля, но он все еще медленный.

Должен ли я сделать что-то другое? Я делаю что-то неправильно в переиндексации или что-то в этом роде?

Заранее благодарен!

+0

Какая версия ES? –

+0

Elasticsearch 2.3 –

+0

Fielddata используется для сортировки и агрегации по этим конкретным полям. Это не поможет с вашим конкретным запросом, потому что вы не используете эти поля для сортировки или внутри агрегации. Я бы попробовал другой тип загружаемой загрузки, а на дочернем - не поля родителя: '" loading ":" eager_global_ordinals "'. Более полный пример [здесь] (https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child-performance.html#_global_ordinals_and_latency).Кроме того, не забывайте, что кеш фильтра также играет роль :-). –

ответ

1

Fielddata используется для сортировки и агрегации по этим конкретным полям. Это не поможет с вашим конкретным запросом, потому что вы не используете эти поля для сортировки или внутри агрегации. Я бы попробовал другой тип загружаемой загрузки, а на дочернем - не поля родителя: "loading": "eager_global_ordinals". Более полный пример here.

Родительские отношения используют глобальные ординалы для ускорения объединений. Глобальные ординалы имеют две цели: снизить размер использования памяти на associating numerics with string fields и тот, который я упомянул выше.

Elasticserch использует в памяти объединения между родителями и детьми, чтобы заставить отношения работать. Для этих объединений используются глобальные ординалы. Они должны быть построены и предварительно загружены. Используя "loading": "eager_global_ordinals", он должен предварительно загрузить глобальные ординалы и ускорить поиск, поскольку эти соединения уже предварительно загружены в память.