Для определения запросов в OpenSearch используется комплексный язык запросов DSL (Domain Specific Language), основанный на JSON. DSL использует два отдельных типа запросов: листовые запросы и составные запросы.
- Листовые запросы - как и запросы на совпадение, термин и диапазон, листовые запросы ищут конкретное значение в определенном поле. Эти запросы могут использоваться сами по себе.
- Составные запросы - они изменяют поведение других составных или листовых запросов, объединяют их результаты и/или переключают контекст с запроса на фильтр. Вы можете логически объединить множество запросов, например запросы bool и dis_max, или изменить поведение многих запросов с помощью составных запросов, например запросов constant_score и boosting.
Запрос constant_score оборачивает другие запросы, выполняя их в контексте фильтра.
Для всех совпадающих документов выдается одинаковый "постоянный" _score.
Показатели релевантности, контекст запроса и контекст фильтра
По умолчанию OpenSearch группирует релевантные результаты поиска на основе оценки релевантности, которая определяет, насколько близко каждый документ соответствует запросу (тому, что было найдено). Показатель релевантности представлен положительным значением с плавающей точкой в поле метаданных _score поискового API.
Чем выше _score, тем более релевантным является документ. Расчет показателя релевантности также зависит от того, выполняется ли предложение запроса в контексте запроса или фильтра, хотя показатели релевантности для каждого типа запроса могут рассчитываться по-разному. Клаузы запроса могут вести себя по-разному в зависимости от того, используются ли они в контексте запроса или в контексте фильтра.
Предложение запроса отвечает на вопрос "Насколько хорошо этот документ соответствует данному предложению запроса?" в контексте запроса. Оценка релевантности поля метаданных _score вычисляется по условию запроса, которое также решает, соответствует ли документ. Как только условие запроса передается параметру запроса, например параметру запроса в API поиска, вступает в силу контекст запроса.
В контексте фильтра фраза запроса дает ответ на вопрос "Соответствует ли этот документ фразе запроса?". Ответ прост. Только "Да" или "Нет"; оценки не вычисляются.
Контекст фильтра чаще всего используется для фильтрации структурированных данных. Для повышения эффективности OpenSearch автоматически кэширует часто используемые фильтры. Контекст фильтра активен, когда параметру фильтра предоставляется предложение запроса, например, агрегат фильтра, параметр фильтра в запросе constant_score, параметры filter или must_not в запросе bool.
OpenSearch поддерживает как структурированные данные, так и полнотекстовые запросы. Структурированный поиск не нуждается в скоринге, в то время как полнотекстовые запросы нуждаются в нем, чтобы найти наиболее подходящие документы с помощью механизмов скоринга. Мы можем изменить скоринговый запрос, который обычно выполняется в контексте запроса, на контекст фильтра без скоринга с помощью запроса constant_score.
Запрос constant_score извлекает все совпадающие документы с оценкой релевантности, равной значению параметра boost, после обертывания запроса фильтра.
Когда следует использовать запрос с постоянной оценкой?
Запрос constant_score дает равный балл любому совпавшему документу. Его можно использовать, когда, в отличие от фильтра, вам не важно, насколько совпал документ, а важно лишь то, совпал он или нет, а также выдать оценку. Параметр boost используется запросом constant_score для установки оценки для каждого совпадающего документа.
Как реализовать запрос с постоянными показателями
Запросы с постоянной оценкой имеют два параметра верхнего уровня, а именно:
- filter: обязательный параметр объекта запроса, представляющий запрос фильтра, который вы хотите запустить; все возвращаемые документы должны соответствовать этому запросу. Оценка релевантности не рассчитывается для запросов с фильтром. OpenSearch автоматически кэширует часто используемые запросы-фильтры для повышения производительности.
- boost: необязательный параметр типа float, представляющий собой число с плавающей точкой, которое используется в качестве постоянной оценки релевантности для каждого документа, соответствующего запросу фильтра. Его значение по умолчанию равно 1,0.
Ниже приведена общая структура запроса с постоянной оценкой:
1 2 3 4 5 6 7 8 9 10 11 | GET index_name/_search { "query": { "constant_score": { "filter": { "match" : {"<field_name>" : "<your_value>"} }, "boost": float number that you want to use as a constant score for every matching document } } } |
Запрос на соответствие обычно выполняется в контексте запроса, это означает, что когда OpenSearch выполняет запрос на соответствие, он оценивает все документы в дополнение к их фильтрации. Когда используется запрос с постоянной оценкой, как показано в примере ниже, запрос с оценкой, который обычно выполняется в контексте запроса, меняется на контекст фильтра без оценки.
Запрос с постоянной оценкой получит все совпадающие документы (в данном случае со значением "Elie" в поле author_name) с оценкой релевантности, равной значению параметра boost, которое составляет 1,2 после обертывания запроса фильтра.
1 2 3 4 5 6 7 8 9 10 11 | GET authors/_search { "query": { "constant_score": { "filter": { "match": { "author_name": "Elie" } }, "boost": 1.2 } } } |
Фильтрующие формулы выполняются в контексте фильтра, поэтому оценка не учитывается, а формулы рассматриваются для кэширования.
Фильтр constant_score должен обернуть запрос на соответствие, если мы хотим ускорить его и кэшировать. Используйте эту стратегию, если вам не важна оценка релевантности, как показано в примере ниже.
1 2 3 4 5 6 7 8 9 10 | GET authors/_search { "query": { "constant_score" : { "filter" : { "match": { "author": "Elie" } } } } } |
Теперь запрос выполняется быстрее, поскольку оценка релевантности больше не рассчитывается. Он также автоматически кэшируется.
Подводя итог, можно сказать, что запрос constant_score изменяет любой запрос в контексте фильтра с показателем релевантности, равным значению параметра boost, значение которого по умолчанию равно 1.
Примечания и полезные сведения
- Баллы вычисляются как значения с плавающей точкой одинарной точности с точностью 24 бита для значащего числа, когда запросы используются в контексте запроса. Вычисления баллов, точность которых превышает точность знака, будут преобразованы в плавающие значения, однако при этом будет потеряна некоторая точность.
- Используйте контекст запроса только для условий, которые должны влиять на оценку документов, которые совпадают (т. е. насколько близко документ совпадает), и фильтрующий контекст для всех остальных пунктов запроса.