2016-06-13 2 views
9

У меня есть индекс ES с документами среднего размера (более 15-30 МБ).Elasticsearch: размер документа и производительность запросов

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

Будет ли размер документа влиять на производительность этого запроса?

"size": 1, 
    "query": { 
     "term": { 
     "my_field": True 
     } 
    }, 
    "_source": [ 
     "my_field" 
    ] 

И будет ли результат «размера»: 0 в лучшем времени?

+0

Не следует ли использовать «поля» вместо «_source»? BTW. и советы джордивадора в его ответе должны помочь в исполнении. Если у вас есть индекс, просто делайте тесты, чтобы быть уверенными! –

ответ

1

Добавив "size":0 к вашему запросу, вы избежите некоторой чистой передачи, это поведение улучшит время вашей работы.

Но, как я понимаю ваш случай использования, вы можете использовать count

Пример запроса:

curl -XPOST 'http://localhost:9200/test/_count -d '{ 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "id": xxxxx 
       } 
      }, 
      { 
       "term": { 
       "bool_field": True 
       } 
      } 
      ] 
     } 
     } 
    }' 

С этого запроса только проверка, если есть какой-то общий, вы будете знать, если документ с некоторый id установил поле bool в true/false в зависимости от значения, указанного вами в bool_field при запросе. Это будет довольно быстро.

1

Учитывая, что Elasticsearch проиндексирует ваши поля, размер документа не будет большой проблемой для производительности. Использование размера 0 не влияет на производительность запросов внутри Elasticsearch, но положительно влияет на производительность, чтобы получить документ, потому что сетевой перенос.

Если вы просто хотите проверить одно булево поле для конкретного документа вы можете просто использовать Get API, чтобы получить документ, просто извлекая поле, которое вы хотите проверить, как это:

curl -XGET 'http://localhost:9200/my_index/my_type/1000?fields=my_field' 

В этом случае Elasticsearch воли просто получите документ с _id = 1000 и поле my_field. Таким образом, вы можете проверить значение boolean.

{ 
    "_index": "my_index", 
    "_type": "my_type", 
    "_id": "1000", 
    "_version": 9, 
    "found": true, 
    "fields": { 
    "my_field": [ 
     true 
    ] 
    } 
} 
1

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

Однако, если предположить, что это новейший поиск elastics и учитывая, что вы после одного значения, наилучшим подходом является изменение вашего запроса в не-scoring-filtering query. Фильтры довольно быстро в поиске elastics и очень легко кэшируются. Выполнение запроса без учета позволяет полностью исключить фазу подсчета (расчет релевантности и т. Д.).

Для этого:

GET localhost:9200/test_index/test_partition/_search 
{ 
"query" : { 
    "constant_score" : { 
     "filter" : { 
      "term" : { 
       "my_field" : True 
      } 
     } 
    } 
} 

}

Обратите внимание, что мы используем API поиска. Константа_используется для преобразования термина query в фильтр, который должен быть неотъемлемо быстрым.

Для получения дополнительной информации. Пожалуйста, см.

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