Как импровизировать на тяжелые запросы в огромном наборе данных? - PullRequest
1 голос
/ 05 июня 2019

Моя задача заключается в использовании упругого поиска (5.6) для выполнения запросов в формате

  • слово1 И слово2 И слово3
    QueryBuilder builders = QueryBuilders.boolQuery()
                          .must(QueryBuilders.matchQuery("text", "word1"))
                          .must(QueryBuilders.matchQuery("text", "word2"))
                          .must(QueryBuilders.matchQuery("text", "word3"));


  • слово1 ИЛИ слово2 ИЛИ слово3
    QueryBuilder builders = QueryBuilders.boolQuery()
                  .should(QueryBuilders.matchQuery("text", "word1"))
                  .should(QueryBuilders.matchQuery("text", "word2"))
                  .should(QueryBuilders.matchQuery("text", "word3"));

Слово 1 содержится в 5874 документах, слово 2 в 270419 документах и ​​слово 3 в 397829 документах.

Я реализовал код получения идентификаторов документов.

Общее время, затраченное на первый запрос, составляет 2 секунды, в то время как для второго время резко увеличивается до 300 секунд. Это то, что ожидается? Или может быть что-то не так с моей реализацией получения значений?

1 Ответ

1 голос
/ 05 июня 2019

Учитывая тот факт, что вы извлекаете идентификаторы документов, я могу предположить, что вы не выполняете запрос, а скорее сканируете и извлекаете все документы, которые удовлетворяют вашему запросу.

Теперь первыйзапрос является пересечением по сравнению со вторым, который является объединением.Учитывая тот факт, что эти слова встречаются в документах 5874, 270419 и 397829, пересечение имеет максимальную длину 5874, а объединение имеет длину 397829. Это количество документов, которые кластер ES будет возвращать для этих двух случаев.

Резкое различие в затратах времени между двумя делами связано с количеством документов, которые должны быть возвращены.Для сканирования вы должны выполнять нумерацию страниц (с помощью прокрутки) и повторять в цикле.И это займет некоторое время, если количество документов увеличится.

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

...