Булевые запросы OpenSearch - Filter, Must, Should и Must_not.

Булевы запросы используются для обрамления поискового запроса логическими операторами, а именно "AND", "OR" и "NOT". OpenSearch поддерживает такую же возможность с помощью "bool query". Эти запросы могут быть оформлены в соответствии с вашими требованиями.

Мы можем добавить любой тип запроса в каждое предложение bool, например terms, match или query_string.

Фильтр и запрос

Когда следует использовать фильтры?

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

Когда следует использовать запросы?

  • Контекст запроса - это поиск термина или нескольких терминов и наблюдение за тем, насколько хорошо документы соответствуют ему. В таких случаях можно использовать формулы "должен" и "следует".
  • Эти типы запросов действительно влияют на ваш результат.

Как можно добиться усиления в булевых запросах

По умолчанию OpenSearch сортирует результаты на основе баллов. Оценка будет вычисляться для документов, которые соответствуют запросу в "контексте запроса". В таких случаях мы можем применить boosting для каждого запроса внутри этих клаузул. Больше примеров вы найдете в следующем разделе.

После этого OpenSearch будет возвращать 0.0 в качестве оценки для документов, соответствующих любому пункту фильтра. Есть несколько случаев, когда нам нужно применить оценки и для этих отфильтрованных документов. В таких случаях в предложении фильтра можно использовать "constant_score", чтобы вернуть оценку релевантности для всех документов, соответствующих предложению фильтра.

Типы булевых выражений в OpenSearch

  • Filter
  • Must
  • Should
  • Must_not

Один булевский запрос может содержать комбинацию этих условий. Например:

Filter

Предложение filter будет использоваться для отсеивания документов, соответствующих запросу.

Все условия являются обязательными: OpenSearch вернет только те документы, которые соответствуют всем условиям. При этом оценка не будет вычисляться.

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

В приведенном выше примере мы пытаемся отфильтровать документы, в которых присутствует цвет "синий" (blue) и которые есть в наличии. Здесь цвет - это поле типа "keyword". Поэтому документы будут отфильтрованы только в том случае, если они соответствуют точному термину, к тому же чувствительному к регистру. Поле "in_stock" имеет тип boolean, поэтому OpenSearch просто возвращает все доступные товары.

Как упоминалось ранее, оценки для таких типов поиска не вычисляются. Если запрос содержит только этот фильтр, то максимальная оценка будет равна "0.0".

Must

Пункт "must" также является обязательным, поэтому возвращаются только те документы, которые соответствуют всем пунктам.

Это похоже на логический оператор "AND". Все запросы внутри "must" будут объединены оператором "AND".

Этот тип запросов вносит свой вклад в оценку.

В приведенном выше примере мы пытаемся найти документы, в которых есть и цвет "blue", и тип p_type "Floral Top". Здесь "p_type" - это поле текстового типа, а "color" - тип ключевого слова.

OpenSearch попытается найти соответствие между терминами "цветочный" и "верхний" (поиск без учета регистра) в поле p_type и выполнить точное совпадение в поле color (поиск с учетом регистра).

Кроме того, запрос термина имеет параметр "boost". Это означает, что документы, соответствующие данному запросу, будут оценены в 5.0 баллов. Оценка будет рассчитана для документов, соответствующих этому запросу, как 1.0 * 5.0 = 5.0.

Should

Условия, используемые в запросе " should", объединяются с помощью оператора "OR". OpenSearch возвращает документы, соответствующие любому из условий.

Если в запросе используется несколько условий, то мы можем добавить к запросу "minimum_should_match". Это поможет вернуть документы, которые частично совпадают с заданным значением "mm".

OpenSearch поддерживает несколько форматов при настройке значения Minimum_should_match. Некоторые из них представляют собой проценты, а другие - прямые числовые значения. Если в качестве значения "mm" указано "30%", то OpenSearch вернет документы, совпадающие как минимум с 30% слов в заданной фразе. Аналогично, для прямых числовых значений, эти термины должны быть найдены в возвращаемом документе.

В приведенном выше примере мы пытаемся найти документы, которые могут содержать либо цвет "blue", либо текстовое поле поиска по умолчанию "Floral Long Sleeve Dress" (поиск без учета регистра).

Поскольку значение "minimum_should_match" составляет 50 %, из 4 слов, если какой-либо документ соответствует 2 словам, OpenSearch вернет эти документы и рассчитает оценку на основе совпавших терминов.

Запрос по первому термину имеет дополнительный параметр "boost". Он используется для увеличения количества документов, соответствующих этому запросу, с помощью значения boost, равного "2.0". Оценка будет рассчитана для документов, соответствующих этому единственному запросу, как 1,0 * 2,0 = 2,0

Must_not

Запрос с условием must_not также работает в контексте "фильтр". Он похож на логический оператор "NOT", когда документы, соответствующие этим запросам, не будут возвращены.

Это не влияет на итоговую оценку, и результаты этих запросов можно кэшировать.

Приведенный выше запрос возвращает все документы, в которых нет цвета "blue".

Заключение

В этой статье мы узнали о bool-запросе в OpenSearch и о том, как использовать его в различных сценариях. Хорошо сформулированный булевский запрос позволяет получить релевантные результаты и значительно повысить производительность запроса.

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