Для определения запросов в OpenSearch используется комплексный язык запросов DSL (Domain Specific Language), основанный на JSON. DSL использует два отдельных типа запросов: листовые запросы и составные запросы.
- Листовые запросы - как и запросы на совпадение, термин и диапазон, листовые запросы ищут конкретное значение в определенном поле. Эти запросы могут использоваться сами по себе.
- Составные запросы - они изменяют поведение других составных или листовых запросов, объединяют их результаты и/или переключают контекст с запроса на фильтр. Можно логически объединить множество запросов, например запросы bool и dis_max, или изменить поведение множества запросов с помощью составных запросов, например запросы constant_score и boosting.
При усилении запроса возвращаются только документы, соответствующие положительному запросу; при этом минимизируется оценка документов, соответствующих отрицательному запросу.
Для чего используется повышающий запрос в OpenSearch?
Усиливающие запросы возвращают документы, соответствующие положительному запросу, при этом снижая оценку релевантности документов, соответствующих отрицательному запросу. С помощью повышающего запроса вы можете понизить рейтинг определенных документов, не исключая их из результатов поиска.
Чтобы лучше понять принцип использования усиления запроса, представьте, что у вас есть набор критериев поиска и набор документов, удовлетворяющих этим критериям. Существует подмножество этих документов, обладающих определенными характеристиками, которые могут быть проверены запросом OpenSearch, и эти документы должны быть перемещены в конец списка результатов, даже если вы хотите, чтобы пользователь увидел все эти статьи. Поэтому мы используем отрицательный бустинг по этому запросу.
Как реализовать бустинг-запрос
Бустинг-запросы имеют три параметра верхнего уровня, а именно:
- positive: обязательный параметр объекта запроса, который представляет собой запрос, который вы хотите выполнить. Каждый возвращенный документ должен соответствовать запросу. Это основной запрос, определяющий критерии, по которым будут возвращаться документы.
- negative: обязательный параметр объекта запроса, представляющий запрос, который был использован для снижения оценки релевантности документов, которые совпали. Запрос boosting определяет итоговую оценку релевантности документа следующим образом: если возвращаемый документ соответствует как положительному, так и отрицательному запросу, возьмите начальную оценку релевантности из положительного запроса и умножьте ее на значение negative_boost.
- negative_boost: обязательный параметр типа float. Оценка релевантности документов, соответствующих отрицательному запросу, уменьшается с помощью этого числа с плавающей точкой, которое находится в диапазоне от 0 до 1,0.
Результаты отрицательных запросов умножаются на значение от 0 до 1, которое называется "negative_boost". Значение отрицательного запроса уменьшается до четверти значения положительного запроса, если negative_boost установлен на 0,25; до половины при 0,5, до одной десятой при 0,1 и т. д. В результате вы получаете большую свободу действий при оценке запросов.
В приведенном ниже примере запрос с повышающим коэффициентом позволяет нам все еще включать результаты, но понижать их рейтинг ниже, чем это было бы в противном случае.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | GET books/_search { "query": { "boosting": { "positive": { "match": { "text": "Programming" } }, "negative": { "term": { "text": "C++" } }, "negative_boost": 0.5 } } } |
Принимаются как положительные, так и отрицательные запросы. Документы, которые также соответствуют отрицательному запросу "C++", будут понижены в рейтинге путем умножения исходного _score документа на negative_boost. Только документы, соответствующие положительному запросу "Programming", будут включены в список результатов. Любые документы в верхнем примере, содержащие любой из отрицательных терминов, будут уменьшены в два раза.
В другом примере ниже нам нужны книги с OpenSearch в названии, но мы также хотим снизить релевантность книг, опубликованных до 2017 года.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | GET books/_search { "_source": [ "title", "publish_date" ], "query": { "boosting": { "positive": { "match": { "title": "OpenSearch" } }, "negative": { "range": { "publish_date": { "lt": "2017-01-01" } } }, "negative_boost": 0.2 } } } |
В верхнем примере мы использовали диапазон запросов в качестве отрицательного запроса в повышении запроса, чтобы применить дефлятор на релевантность, который делает книги, опубликованные после 2017 года с "OpenSearch" в названии, наиболее релевантными книгами.
Примечания и полезные сведения
- В контексте запроса баллы вычисляются как числа с плавающей точкой одинарной точности с точностью 24 бита для значащего числа. Вычисления баллов, точность которых превышает точность знака, будут преобразованы в плавающие числа с некоторой потерей точности.
- Используйте контекст фильтра для всех остальных пунктов запроса и контекст запроса только для условий, которые должны влиять на оценку документов, которые совпадают (т. е. насколько близко документ совпадает).