Elasticsearch — Урок 6.5 Поиск по нескольким полям

multi_match предназначен для поиска по нескольким полям. Когда пользователь выполняет поиск всесезонная куртка только по полю product_name, он может не найти оптимальный результат.

Чтобы расширить поиск, мы можем попробовать искать в description и product_name. Документ, содержащий оба слова показан здесь:

Оценка на основе одного поля довольно проста, оценка на основе нескольких полей становится несколько сложней. Лучшим решением будет использовать multi_match для поиска по полям product_name и description:

По умолчанию запрос multi_match выполняется в режиме best_fields. Используется оценка лучше всего совпадающего поля. Мы также можем использовать, tie_breaker чтобы суммировать оценки из других полей, как показано ниже:

Оценки из других полей умножаются 0.2 и добавляются к лучшему совпадающему полю. Multi-match внутренне переводится в dis_max запрос. В отличие от bool запроса, который суммирует все оценки из всех запросов, dis_max запрос возвращает оценку наилучшего совпадающего запроса:

Multi-match также предоставляет некоторые полезные настройки, чтобы увеличить оценку для отдельных полей. Если совпадение product_name более важно, чем description, мы можем увеличить важность product_name используя символ каретки (^), как показано ниже:

В зависимости от того, как вы хотите, чтобы документы были оценены, multi_match поддерживаются три типа запроса. Эти типы отличаются тем, как используются оценки из разных полей для расчета окончательной оценки каждого документа. В следующих разделах мы попробуем запустить все три типа на примере одного запроса и посмотрим как изменяется оценка.

best_fields

best_fields являются типом по умолчанию, и возвращается результат наилучшего совпадающего поля. Например, если вы в поисках слова куртка в product_name и description полях, multi_match запрос выглядит следующим образом:

По умолчанию термин запроса анализируется и разбивается на отдельные термины на основе анализатора полей. Например, мы спрашиваем о мужская куртка. Используя стандартный анализатор, запрос разбивается на мужская и куртка. При использовании русского анализатора запрос будет разбит на мужск и куртк. Указав анализатор, мы просим Elasticsearch использовать тот же анализатор для всех полей, независимо от их сопоставлений.

Большинство совпадающих полей (most_fields)

Multi_match запрос, при выполнении с типом most_fields суммирует баллы всех полей. Давайте попробуем тот же запрос, но зададим тип most_fields:

Результат:

Соединение полей (cross_fields)

Предыдущие типы выполняют запрос в разных полях и объединяют баллы для получения окончательного результата. Данный тип идет своей дорогой, а именно объединяет поля, как если бы они были одной большой строкой и уже следом происходит поиск и оценка:

Так же в нашем распоряжение есть типы phrase — поиск фразы и phrase_prefix — поиск фразы с не точным окончанием. Если интересно поэкспериментируйте и с ними.