Прежде чем мы приступим к выполнению поиска в кластере Elasticsearch, я хочу представить основные концепции поиска в Elasticsearch.
В этом посте я расскажу о релевантности и скоринге в Elasticsearch. Я также кратко представлю два способа поиска, а также различные типы запросов.
Релевантность и ранжирование
Elasticsearch вычисляет балл для каждого документа, соответствующего заданному запросу, и ранжирует документы в соответствии с этим баллом. Чем выше балл, тем более релевантен документ поисковому запросу. При поиске есть два различных контекста, в которых могут применяться запросы: контекст запроса и контекст фильтра. Запросы в контексте запроса отвечают на вопрос "насколько хорошо документ соответствует запросу?", предполагая, что он соответствует. Запросы в контексте фильтра, с другой стороны, отвечают на вопрос "соответствует ли документ?". Если документ не соответствует фильтру, то он отбрасывается и не попадает в результаты. Важно отметить, что фильтры не влияют на оценки совпадающих документов, а скорее отсеивают документы, которые не удовлетворяют требованиям фильтров.
Способы поиска
Теперь мы кратко обсудим два способа поиска в Elasticsearch, а именно: по строке запроса и с помощью DSL запроса.
Строка запроса
Первый способ поиска с помощью Elasticsearch - это строка запроса. Этот метод использует только URL для выполнения поиска, а поисковый запрос задается с помощью параметра q. Этот метод обычно используется для простых запросов и специальных запросов в командной строке, но он также поддерживает довольно сложные запросы. Ниже приведен пример того, как может выглядеть запрос.
1 | GET http://localhost:9200/ecommerce/product/_search?q=паста |
URL указывает конечную точку кластера Elasticsearch и осуществляет поиск документов типа отображения продукта в индексе ecommerce. Для выполнения поиска используется API _search, а поисковый запрос задается в качестве параметра запроса. По умолчанию поиск ведется по всем полям. Этот запрос HTTP GET - все, что нужно для выполнения поиска в Elasticsearch.
Запрос DSL
Другим способом является использование так называемого DSL запроса. При таком подходе запрос определяется в JSON в теле запроса, а не в URL. Запрос DSL является более гибким и поддерживает больше функций, чем подход с использованием строки запроса, и поэтому часто используется для более сложных запросов. Для более сложных запросов JSON также легче читать, чем длинную строку запроса. Ниже показан запрос, аналогичный тому, который вы видели минуту назад.
1 2 3 4 5 6 7 8 | GET http://localhost:9200/ecommerce/product/_search { "query": { "match": { "name": "паста" } } } |
Единственное отличие заключается в том, что в этом запросе я явно указываю, по какому полю я ищу, но при желании я мог бы указать и поле _all. В данном случае я ищу продукты, в названии которых присутствует термин "паста". Как вы можете видеть, параметр q был заменен на JSON в теле запроса.
Типы запросов
Теперь, когда я познакомил вас с тем, как можно выполнять поиск в Elasticsearch, я перейду к обсуждению различных типов или категорий запросов.
Составные и линейные запросы
В Elasticsearch существует два основных типа запросов: листовые и составные. Листовые запросы ищут определенные значения в определенных полях. Это может быть паста в поле названия продукта, как в предыдущих примерах. Эти запросы могут использоваться сами по себе, не являясь частью составного запроса. Их также можно использовать в составных запросах для построения более сложных запросов. Составные запросы - это запросы, которые включают в себя листовые клаузулы или даже другие клаузулы составного запроса. Они используются для объединения нескольких запросов, обычно с помощью булевой логики, и могут быть использованы для изменения поведения запросов.
Полный текст
Полнотекстовые запросы используются для выполнения полнотекстовых запросов, то есть для поиска термина в потенциально большом количестве текста. Все примеры, приведенные в этой заметке, были полнотекстовыми. При добавлении документов или изменении значений документов анализируются значения полей полного текста. В зависимости от используемого анализатора, этот процесс может включать удаление стоп-слов, токенизацию слов и изменение нижнего регистра текста. Для того чтобы поиск совпадал, анализатор поля также применяется к строке запроса перед выполнением поискового запроса.
Уровень термина
Запросы уровня термина используются для поиска точных значений и поэтому обычно применяются для структурированных данных, таких как числа и даты. Примером может служить поиск людей, родившихся между 1980 и 2000 годами. Поскольку запросы уровня термина используются для точного сопоставления, поисковые запросы не анализируются перед выполнением.
Объединение запросов
Поскольку выполнение объединений в распределенной системе требует больших затрат производительности, Elasticsearch предлагает две формы объединений, предназначенные для горизонтального масштабирования. Первая - это вложенный запрос, который вы, возможно, помните из моего рассказа о вложенном типе данных. Если документ содержит поле типа вложенный с массивом объектов, то каждый из этих объектов может быть запрошен как независимый документ с помощью вложенного запроса. Далее следуют запросы has_child и has_parent, которые полезны для определения отношений "родитель-ребенок" между двумя типами документов. Запрос has_child возвращает родительские документы, дочерние документы которых соответствуют данному запросу, а запрос has_parent возвращает дочерние документы, родительский документ которых соответствует данному запросу. Таким образом, запрос has_child используется для добавления условий запроса к дочерним документам, а запрос has_parent - для добавления условий запроса к родительским документам.
Геозапросы
Последними, но не менее важными, являются геозапросы. Как вы помните, существует два типа данных для геополей: geo_point и geo_shape. Существует ряд геозапросов, которые используют эти поля для выполнения географического поиска, например, для нахождения близлежащих точек интереса на основе GPS-координат. Таких запросов довольно много, поэтому я не буду их сейчас перечислять.
Это все, что я хотел, чтобы вы знали, прежде чем погрузиться в поиск, который также является самой интересной частью. Так что присоединяйтесь ко мне в следующем посте, где я покажу вам, как искать в Elasticsearch.