Фильтрация результатов поиска
Вы можете использовать два метода для фильтрации результатов поиска:
- Используйте булеву (boolean) запроса с клаузой
filter. Запросы поиска применяют булевы фильтры к результатам поиска и агрегациям. -
Используйте параметр
post_filterAPI поиска. Запросы поиска применяют пост-фильтры только к результатам поиска, а не к агрегациям. Вы можете использовать пост-фильтр для расчета агрегаций на основе более широкого набора результатов, а затем сузить результаты.Вы также можете переранжировать результаты после пост-фильтра, чтобы улучшить релевантность и изменить порядок результатов.
Пост-фильтр
Когда вы используете параметр post_filter для фильтрации результатов поиска, результаты поиска фильтруются после расчета агрегаций. Пост-фильтр не влияет на результаты агрегаций.
Например, вы продаете рубашки со следующими свойствами:
PUT /shirts
{
"mappings": {
"properties": {
"brand": { "type": "keyword"},
"color": { "type": "keyword"},
"model": { "type": "keyword"}
}
}
}
PUT /shirts/_doc/1?refresh
{
"brand": "gucci",
"color": "red",
"model": "slim"
} Представьте, что пользователь задал два фильтра:
color:red и brand:gucci. Вы хотите показать им только красные рубашки Gucci в результатах поиска. Обычно это делается с помощью bool запроса:
GET /shirts/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "color": "red" }},
{ "term": { "brand": "gucci" }}
]
}
}
} Однако, вы также хотите использовать навигацию по категориям для отображения списка других опций, которые пользователь может выбрать. Возможно, у вас есть поле model, которое позволит пользователю ограничить результаты поиска красными рубашками Gucci t-shirts или dress-shirts.
Это можно сделать с помощью terms агрегации:
GET /shirts/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "color": "red" }},
{ "term": { "brand": "gucci" }}
]
}
},
"aggs": {
"models": {
"terms": { "field": "model" }
}
}
} | Возвращает наиболее популярные модели красных рубашек Gucci. |
Но, возможно, вы также хотите сказать пользователю, сколько рубашек Gucci есть в других цветах. Если вы просто добавите terms агрегацию по полю color, вы получите только цвет red, потому что ваш запрос возвращает только красные рубашки Gucci.
Вместо этого, вы хотите включить рубашки всех цветов во время агрегации, а затем применить colors фильтр только к результатам поиска. В этом и состоит назначение post_filter:
GET /shirts/_search
{
"query": {
"bool": {
"filter": {
"term": { "brand": "gucci" }
}
}
},
"aggs": {
"colors": {
"terms": { "field": "color" }
},
"color_red": {
"filter": {
"term": { "color": "red" }
},
"aggs": {
"models": {
"terms": { "field": "model" }
}
}
}
},
"post_filter": {
"term": { "color": "red" }
}
} | Основной запрос теперь находит все рубашки Gucci, независимо от цвета. | |
| Агрегация | |
| Агрегация | |
| Наконец, |
Переранжировка отфильтрованных результатов поиска
Переранжировка может помочь повысить точность, переупорядочив только верхние (например, 100-500) документов, возвращенные фазами query и post_filter, используя вторичный (обычно более затратный) алгоритм, вместо применения дорогостоящего алгоритма ко всем документам в индексе.
Запрос rescore выполняется на каждом фрагменте перед возвратом результатов для сортировки узлом, обрабатывающим общий запрос поиска.
В настоящее время API переранжирования имеет только одно реализацию: переранжировщик запросов, который использует запрос для изменения оценки. В будущем могут быть доступны альтернативные переранжировщики, например, парный переранжировщик.
Будет выброшено исключение, если явным образом указана sort (кроме _score в порядке убывания) с запросом rescore.
При отображении постраничной навигации пользователю не следует изменять window_size при переходе к каждой странице (передавая разные значения from), так как это может изменить лучшие совпадения, что приведет к путанице при переходе пользователя к другим страницам.
Переранжировщик запросов
Переранжировщик запросов выполняет второй запрос только для Top-K результатов, возвращенных фазами query и post_filter. Количество документов, которые будут проверены на каждом фрагменте, можно контролировать с помощью параметра window_size, который по умолчанию равен 10.
По умолчанию оценки от исходного запроса и запроса переранжирования комбинируются линейно для получения окончательной оценки _score для каждого документа. Степень важности исходного запроса и запроса переранжирования можно контролировать с помощью параметров query_weight и rescore_query_weight соответственно. Оба по умолчанию равны 1.
Например:
POST /_search
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : {
"window_size" : 50,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"slop" : 2
}
}
},
"query_weight" : 0.7,
"rescore_query_weight" : 1.2
}
}
} Способ объединения оценок можно контролировать параметром score_mode:
| Режим оценки | Описание |
|---|---|
| Сложить исходную оценку и оценку запроса переранжирования. По умолчанию. |
| Умножить исходную оценку на оценку запроса переранжирования. Полезно для переранжирования с использованием |
| Среднее арифметическое исходной оценки и оценки запроса переранжирования. |
| Максимальная оценка из исходной оценки и оценки запроса переранжирования. |
| Минимальная оценка из исходной оценки и оценки запроса переранжирования. |
Несколько переранжирований
Также можно выполнить несколько переранжирований последовательно:
POST /_search
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : [ {
"window_size" : 100,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"slop" : 2
}
}
},
"query_weight" : 0.7,
"rescore_query_weight" : 1.2
}
}, {
"window_size" : 10,
"query" : {
"score_mode": "multiply",
"rescore_query" : {
"function_score" : {
"script_score": {
"script": {
"source": "Math.log10(doc.count.value + 2)"
}
}
}
}
}
} ]
} Первое получает результаты запроса, затем второе — результаты первого и т. д. Второе переранжирование «увидит» сортировку, выполненную первым переранжированием, поэтому можно использовать большой диапазон для первого переранжирования, чтобы получить документы в меньший диапазон для второго переранжирования.
© 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/7.17/filter-search-results.html