Теперь, когда мы рассмотрели, как искать с помощью строк запросов, я покажу вам, как выполнять поиск, определяя запросы в теле запроса в JSON. Этот подход называется Query DSL.
Первый запрос, который я собираюсь вам показать, - это запрос, который соответствует всем документам, подобно тому, как мы использовали подстановочный знак звездочки в строке запроса в предыдущей статье. Теперь, вместо добавления параметра q к URI, мы указываем наш запрос в теле запроса в виде JSON.
1 2 3 4 | GET /ecommerce/product/_search { "query": { "match_all": {} } } |
Свойство query содержит определение запроса, где часть match_all - это тип запроса, который мы хотим выполнить. Этот тип запроса не нуждается в конфигурации, поэтому мы просто оставим его объект пустым.
Теперь, когда я показал вам запрос match_all, давайте перейдем к запросу match, который используется для поиска значений в одном или нескольких полях. Я буду использовать те же примеры, что и в предыдущих лекциях, и покажу вам, как добиться того же самого с помощью запроса DSL. Сначала я найду все товары, в названии которых есть термин "макароны".
1 2 3 4 5 6 7 8 | GET /ecommerce/product/_search { "query": { "match": { "name": "pasta" } } } |
Но что, если вы хотите выполнить поиск по нескольким полям? Теоретически, это можно сделать с помощью булевой логики, используя запрос bool (который мы рассмотрим в одной из следующих лекций). Однако в этом случае вам придется создавать множество подобных запросов, в которых различаются только поля. Вместо этого можно использовать запрос multi_match, который позволяет выполнять запросы на совпадение нескольких полей. Позвольте мне показать вам пример, в котором я ищу термин "макароны" в полях "название" и "описание".
1 2 3 4 5 6 7 8 9 | GET /ecommerce/product/_search { "query": { "multi_match": { "query": "pasta", "fields": [ "name", "description" ] } } } |
Далее я покажу вам, как искать фразы с помощью запроса DSL, используя запрос match_phrase.
1 2 3 4 5 6 7 8 | GET /ecommerce/product/_search { "query": { "match_phrase": { "name": "pasta spaghetti" } } } |
Теперь мы получаем один результат, который содержит термины "паста" и "спагетти" в названии и в таком порядке. Помните, что если мы поменяем термины местами, этот документ больше не будет соответствовать.
Это все, что касается полнотекстового поиска при использовании DSL запроса. Спасибо за чтение и удачного поиска!