Контекст запроса и фильтра
Оценки релевантности
По умолчанию Elasticsearch сортирует результаты поиска, соответствующие запросу, по оценке релевантности, которая измеряет, насколько хорошо каждый документ соответствует запросу.
Оценка релевантности — это положительное число с плавающей точкой, возвращаемое в поле метаданных _score API поиска. Чем выше _score, тем более релевантен документ. Хотя каждый тип запроса может рассчитывать оценки релевантности по-разному, вычисление оценки также зависит от того, выполняется ли условие запроса в контексте запроса или фильтра.
Контекст запроса
В контексте запроса условие запроса отвечает на вопрос «Насколько хорошо этот документ соответствует этому условию запроса?» Помимо определения соответствия документа, условие запроса также рассчитывает оценку релевантности в поле метаданных _score.
Контекст запроса используется всякий раз, когда условие запроса передается в параметр query, например, параметр query в API поиска.
Контекст фильтра
Фильтр отвечает на бинарный вопрос «Соответствует ли этот документ этому условию запроса?». Ответ — просто «да» или «нет». Фильтрование имеет несколько преимуществ:
- Простая бинарная логика: в контексте фильтра условие запроса определяет соответствие документов на основе критерия «да/нет», без расчёта оценки.
- Производительность: так как фильтры не вычисляют оценки релевантности, они выполняются быстрее, чем запросы.
- Кэширование: Elasticsearch автоматически кэширует часто используемые фильтры, что ускоряет последующую производительность поиска.
- Эффективность ресурсов: фильтры потребляют меньше ресурсов процессора по сравнению с полнотекстовыми запросами.
- Комбинирование запросов: фильтры могут быть объединены со запросами с оценкой релевантности для эффективной уточнения набора результатов.
Фильтры особенно эффективны для запросов к структурированным данным и реализации критериев «обязательно иметь» в сложных поисках.
Структурированные данные — это информация, которая организована и отформатирована предсказуемым образом. В контексте Elasticsearch это обычно включает:
- Числовые поля (целые числа, числа с плавающей точкой)
- Даты и метки времени
- Булевы значения
- Поля ключевых слов (строки для точного соответствия)
- Гео-точки и гео-фигуры
В отличие от полнотекстовых полей, структурированные данные имеют последовательный и предсказуемый формат, что делает их идеальными для точных операций фильтрации.
Примеры применения фильтров:
- Проверка диапазона дат: например, находится ли поле
timestampмежду 2015 и 2016 годами - Проверка определённого значения поля: например, равно ли поле
statusзначению "published" или равно ли полеauthorзначению "John Doe"
Контекст фильтра применяется, когда условие запроса передаётся в параметр filter, например:
- Параметры
filterилиmust_notв запросахbool - Параметр
filterв запросахconstant_score - Агрегации
filter
Фильтры оптимизируют производительность и эффективность запросов, особенно для запросов к структурированным данным и при комбинировании с полнотекстовыми поисками.
Пример контекстов запроса и фильтра
Ниже приведен пример использования условий запроса в контекстах запроса и фильтра в API search. Этот запрос будет сопоставлять документы, в которых выполняются все следующие условия:
- Поле
titleсодержит словоsearch. - Поле
contentсодержит словоelasticsearch. - Поле
statusсодержит точное словоpublished. - Поле
publish_dateсодержит дату с 1 января 2015 года.
$params = [
'body' => [
'query' => [
'bool' => [
'must' => [
[
'match' => [
'title' => 'Search',
],
],
[
'match' => [
'content' => 'Elasticsearch',
],
],
],
'filter' => [
[
'term' => [
'status' => 'published',
],
],
[
'range' => [
'publish_date' => [
'gte' => '2015-01-01',
],
],
],
],
],
],
],
];
$response = $client->search($params); resp = client.search(
query={
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": "published"
}
},
{
"range": {
"publish_date": {
"gte": "2015-01-01"
}
}
}
]
}
},
)
print(resp) response = client.search(
body: {
query: {
bool: {
must: [
{
match: {
title: 'Search'
}
},
{
match: {
content: 'Elasticsearch'
}
}
],
filter: [
{
term: {
status: 'published'
}
},
{
range: {
publish_date: {
gte: '2015-01-01'
}
}
}
]
}
}
}
)
puts response res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": "published"
}
},
{
"range": {
"publish_date": {
"gte": "2015-01-01"
}
}
}
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err) const response = await client.search({
query: {
bool: {
must: [
{
match: {
title: "Search",
},
},
{
match: {
content: "Elasticsearch",
},
},
],
filter: [
{
term: {
status: "published",
},
},
{
range: {
publish_date: {
gte: "2015-01-01",
},
},
},
],
},
},
});
console.log(response); GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
} | Параметр | |
| Условие | |
| Параметр |
Оценки, рассчитанные для запросов в контексте запроса, представлены как числа с плавающей точкой одинарной точности; у них есть только 24 бита для точности значащей части. Вычисления оценок, превышающие точность значащей части, будут преобразовываться в числа с плавающей точкой с потерей точности.
Используйте условия запросов в контексте запроса для условий, которые должны влиять на оценку соответствия документов (то есть, насколько хорошо документ соответствует запросу), и используйте все остальные условия запроса в контексте фильтра.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-filter-context.html