Elasticsearch: Введение в поиск

Прежде чем мы приступим к выполнению поиска в кластере Elasticsearch, я хочу представить основные концепции поиска в Elasticsearch.

 

Elasticsearch

В этом посте я расскажу о релевантности и скоринге в Elasticsearch. Я также кратко представлю два способа поиска, а также различные типы запросов.

Релевантность и ранжирование

Elasticsearch вычисляет балл для каждого документа, соответствующего заданному запросу, и ранжирует документы в соответствии с этим баллом. Чем выше балл, тем более релевантен документ поисковому запросу. При поиске есть два различных контекста, в которых могут применяться запросы: контекст запроса и контекст фильтра. Запросы в контексте запроса отвечают на вопрос "насколько хорошо документ соответствует запросу?", предполагая, что он соответствует. Запросы в контексте фильтра, с другой стороны, отвечают на вопрос "соответствует ли документ?". Если документ не соответствует фильтру, то он отбрасывается и не попадает в результаты. Важно отметить, что фильтры не влияют на оценки совпадающих документов, а скорее отсеивают документы, которые не удовлетворяют требованиям фильтров.

Способы поиска

Теперь мы кратко обсудим два способа поиска в Elasticsearch, а именно: по строке запроса и с помощью DSL запроса.

Строка запроса

Первый способ поиска с помощью Elasticsearch - это строка запроса. Этот метод использует только URL для выполнения поиска, а поисковый запрос задается с помощью параметра q. Этот метод обычно используется для простых запросов и специальных запросов в командной строке, но он также поддерживает довольно сложные запросы. Ниже приведен пример того, как может выглядеть запрос.

URL указывает конечную точку кластера Elasticsearch и осуществляет поиск документов типа отображения продукта в индексе ecommerce. Для выполнения поиска используется API _search, а поисковый запрос задается в качестве параметра запроса. По умолчанию поиск ведется по всем полям. Этот запрос HTTP GET - все, что нужно для выполнения поиска в Elasticsearch.

Запрос DSL

Другим способом является использование так называемого DSL запроса. При таком подходе запрос определяется в JSON в теле запроса, а не в URL. Запрос DSL является более гибким и поддерживает больше функций, чем подход с использованием строки запроса, и поэтому часто используется для более сложных запросов. Для более сложных запросов JSON также легче читать, чем длинную строку запроса. Ниже показан запрос, аналогичный тому, который вы видели минуту назад.

Единственное отличие заключается в том, что в этом запросе я явно указываю, по какому полю я ищу, но при желании я мог бы указать и поле _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.

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