Сжатие результатов поиска
Вы можете использовать параметр collapse для сжатия результатов поиска на основе значений полей. Сжатие выполняется путем выбора только документа с наивысшим значением сортировки по ключу сжатия.
Например, следующий поиск сжимает результаты по полю user.id и сортирует их по полю http.response.bytes.
GET my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id"
},
"sort": [
{
"http.response.bytes": {
"order": "desc"
}
}
],
"from": 0
} | Сжимает набор результатов, используя поле | |
| Сортирует результаты по полю | |
| Определяет смещение первого сжатого результата |
Общее количество совпадений в ответе указывает на количество соответствующих документов без сжатия. Общее количество отдельных групп неизвестно.
Поле, используемое для сжатия, должно быть однозначным полем типа keyword или numeric с активированным doc_values.
Сжатие применяется только к результатам с наивысшим совпадением и не влияет на агрегации.
Развернуть результаты сжатия
Также можно развернуть каждый сжатый результат с наивысшим совпадением с помощью параметра inner_hits.
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id",
"inner_hits": {
"name": "most_recent",
"size": 5,
"sort": [ { "@timestamp": "desc" } ]
},
"max_concurrent_group_searches": 4
},
"sort": [
{
"http.response.bytes": {
"order": "desc"
}
}
]
} | Сжимает набор результатов, используя поле | |
| Имя, используемое для раздела внутреннего результата в ответе | |
| Количество | |
| Как сортировать документы внутри каждой группы | |
| Количество одновременных запросов, разрешенных для получения |
См. внутренние результаты для полного списка поддерживаемых параметров и формата ответа.
Также можно запросить несколько inner_hits для каждого сжатого результата. Это может быть полезно, когда необходимо получить несколько представлений сжатых результатов.
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id",
"inner_hits": [
{
"name": "largest_responses",
"size": 3,
"sort": [
{
"http.response.bytes": {
"order": "desc"
}
}
]
},
{
"name": "most_recent",
"size": 3,
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
]
}
]
},
"sort": [
"http.response.bytes"
]
} | Сжимает набор результатов, используя поле | |
| Возвращает три самых больших HTTP ответа для пользователя | |
| Возвращает три самых последних HTTP ответа для пользователя |
Развертывание группы выполняется путем отправки дополнительного запроса для каждого inner_hit запроса для каждого сжатого результата, возвращенного в ответе. Это может значительно замедлить поиск, если у вас слишком много групп или inner_hit запросов.
Параметр запроса max_concurrent_group_searches можно использовать для управления максимальным количеством одновременных поисков, разрешенных на этом этапе. Значение по умолчанию основано на количестве узлов данных и размере пула потоков поиска по умолчанию.
collapse нельзя использовать совместно с прокруткой или переоценкой.
Сжатие с search_after
Сжатие полей можно использовать с параметром search_after. Использование search_after поддерживается только при сортировке и сжатии по одному и тому же полю. Вторичная сортировка также не разрешена. Например, можно сжать и отсортировать по полю user.id, просматривая результаты с помощью search_after:
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id"
},
"sort": [ "user.id" ],
"search_after": ["dd5ce1ad"]
} Второй уровень сжатия
Поддерживается и второй уровень сжатия, который применяется к inner_hits.
Например, следующий поиск сжимает результаты по geo.country_name. Внутри каждой geo.country_name внутренние результаты сжимаются по user.id.
Второй уровень сжатия не поддерживает inner_hits.
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "geo.country_name",
"inner_hits": {
"name": "by_location",
"collapse": { "field": "user.id" },
"size": 3
}
}
} {
"hits" : {
"hits" : [
{
"_index" : "my-index-000001",
"_id" : "oX9uXXoB0da05OCR3adK",
"_type" : "_doc",
"_score" : 0.5753642,
"_source" : {
"@timestamp" : "2099-11-15T14:12:12",
"geo" : {
"country_name" : "Amsterdam"
},
"http" : {
"request" : {
"method" : "get"
},
"response" : {
"bytes" : 1070000,
"status_code" : 200
},
"version" : "1.1"
},
"message" : "GET /search HTTP/1.1 200 1070000",
"source" : {
"ip" : "127.0.0.1"
},
"user" : {
"id" : "kimchy"
}
},
"fields" : {
"geo.country_name" : [
"Amsterdam"
]
},
"inner_hits" : {
"by_location" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "oX9uXXoB0da05OCR3adK",
"_score" : 0.5753642,
"_source" : {
"@timestamp" : "2099-11-15T14:12:12",
"geo" : {
"country_name" : "Amsterdam"
},
"http" : {
"request" : {
"method" : "get"
},
"response" : {
"bytes" : 1070000,
"status_code" : 200
},
"version" : "1.1"
},
"message" : "GET /search HTTP/1.1 200 1070000",
"source" : {
"ip" : "127.0.0.1"
},
"user" : {
"id" : "kimchy"
}
},
"fields" : {
"user.id" : [
"kimchy"
]
}
}
]
}
}
}
}
]
}
}
© 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/collapse-search-results.html