可以使用“collapse”参数根据字段值collapse搜索结果。collapse是通过每个collapse键仅选择排序靠前的文档来完成的。
例如,以下搜索按user.id折叠(collapse)结果,并按http.response.bytes对其进行排序。
GET my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id" (1)
},
"sort": [
{
"http.response.bytes": { (2)
"order": "desc"
}
}
],
"from": 0 (3)
}
(1)使用user.id字段折叠(collapse)结果集
(2)按http.response.bytes对结果进行排序
(3)定义第一个collapse结果的偏移量
用于collapse的字段必须是单值关键字(keyword)或激活了doc_值的数字(numeric)字段。
展开折叠结果
也可以使用“inner_hits”选项展开每个折叠的顶部点击。
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id", (1)
"inner_hits": {
"name": "most_recent", (2)
"size": 5, (3)
"sort": [ { "@timestamp": "desc" } ] (4)
},
"max_concurrent_group_searches": 4 (5)
},
"sort": [
{
"http.response.bytes": {
"order": "desc"
}
}
]
}
(1)使用user.id字段折叠结果集
(2)响应中用于内部命中部分的名称
(3)每个折叠关键点要检索的inner_hits命中数
(4)如何对每个组中的文档进行排序
(5)允许检索每个组的inner_hits命中的并发请求数
也可以为每个collapsed 请求多个inner_hits。当我们想要获得折叠点击的多个表示形式时,这非常有用。
GET /my-index-000001/_search
{
"query": {
"match": {
"message": "GET /search"
}
},
"collapse": {
"field": "user.id", (1)
"inner_hits": [
{
"name": "largest_responses", (2)
"size": 3,
"sort": [
{
"http.response.bytes": {
"order": "desc"
}
}
]
},
{
"name": "most_recent", (3)
"size": 3,
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
]
}
]
},
"sort": [
"http.response.bytes"
]
}
(1)使用user.id字段collapse结果集
(2)返回用户的三个最大HTTP响应
(3)返回用户最近的三个HTTP响应
Collapsing with search_after
字段collapsing可与search_after参数一起使用。只有在对同一字段进行排序和折叠(collapsing)时,才支持使用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"]
}
Second level of collapsing
还支持第二级折叠,并将其应用于内部点击。
例如,以下搜索按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",
"_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" : {
"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"
]
}
}
]
}
}
}
}
]
}
}