Elasticsearch: Поиск с помощью Query DSL: составные запросы

Теперь, когда я показал вам, как использовать полнотекстовые запросы и запросы на уровне терминов с помощью query DSL (Domain Specific Language), пришло время взглянуть на составные запросы. Помните, что составные запросы состоят из листовых запросов или других составных запросов.

Elasticsearch

Для начала я выполню простой поиск, который использует простую булеву логику. В примере будут искаться продукты, в названии которых есть и "pasta", и "spaghetti".

Условия, заданные запросами в массиве must, должны быть истинными, чтобы документ совпал, подобно логическому AND. Совпадения в клаузе must вносят вклад в оценку релевантности документов.

В то время как условия must определяют условия, которые должны быть выполнены, условия must_not определяют условия, которые не должны иметь значение true. Это можно использовать, например, для исключения документов с определенными значениями для конкретных полей. Я приведу пример, который соответствует документам с "pasta" в их названиях, но где "spaghetti" не должно быть частью названия.

Прокрутка результатов покажет, что продукт, в названии которого есть и "pasta", и "spaghetti", был исключен.

Запрос bool также имеет параметр should. Когда один из параметров should совпадает, оценка релевантности документа увеличивается - в противном случае они не имеют никакого эффекта. Поэтому should-клаузулы можно использовать для повышения релевантности некоторых документов, которые удовлетворяют критериям поиска, но должны иметь более высокие показатели релевантности. Хотя я уже упоминал, что формулировки should влияют на оценку релевантности документов только в том случае, если они совпадают, а в противном случае ничего не делают, из этого есть одно исключение. Если в поисковом запросе нет пункта must, то хотя бы один из пунктов should должен совпадать, поэтому в этом случае пункты should ведут себя как логическое OR, где хотя бы один должен быть истинным. Если хотя бы одно обязательное условие присутствует, то никакие условия не должны совпадать, и в этом случае они влияют только на оценку релевантности найденных документов.

Позвольте показать вам пример использования запроса should.

В этом примере названия продуктов должны содержать термин "pasta". Я также добавил запрос на соответствие в предложение should, который ищет термин "spaghetti" в названии продукта. Если я выполню этот запрос, вы увидите, что продукты с "pasta" в названии будут найдены, но вы также можете заметить, что продукт, содержащий и "pasta", и "spaghetti", имеет самый высокий балл релевантности. Позвольте мне объяснить почему. Поскольку у нас есть пункт must, то пункт should является необязательным, и его совпадение не требуется.

Однако документам, в которых условие should истинно, присваивается более высокий балл релевантности. В данном примере это справедливо для продукта, в названии которого присутствуют слова "pasta" и "spaghetti".

Теперь давайте посмотрим, что произойдет, если я уберу условие must.

Поскольку у нас больше нет пункта must, должен совпасть хотя бы один пункт should. В моем случае у меня есть только один, поэтому запрос должен совпадать. Если я выполню запрос и просмотрю результаты, вы увидите, что совпадают только те продукты, в названии которых есть слово "спагетти".

Теперь, когда мы увидели, как можно вложить в bool-запросы формулы must, must_not и should, стоит упомянуть, что для еще большей гибкости и более сложных запросов можно вложить bool-запросы в любую из этих формул.

Есть еще два запроса, которые я хотел бы упомянуть. Первый - это запрос function_score, позволяющий указать функцию, которая может изменять оценку документов, возвращенных запросом. Это может быть полезно для повышения рейтинга вновь добавленных документов или повышения рейтинга документов на основе популярности. Существует также запрос boosting, который можно использовать для снижения оценки документов, соответствующих определенному запросу. Можно определить положительный запрос, который является типичным запросом, а также отрицательный запрос. У документов, соответствующих отрицательному запросу, снижается оценка, и вы можете определить, на сколько она должна быть снижена.

Существуют и другие составные запросы, но вы, скорее всего, столкнетесь именно с этими.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий