折叠搜索结果
编辑折叠搜索结果编辑
您可以使用 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 }
响应中的总命中数表示不进行折叠的匹配文档数。不同组的总数未知。
用于折叠的字段必须是启用了 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" ] }
组的展开是通过为响应中返回的每个折叠命中发送针对每个 inner_hit
请求的附加查询来完成的。如果您有太多组或 inner_hit
请求,这可能会大大降低搜索速度。
max_concurrent_group_searches
请求参数可用于控制此阶段允许的最大并发搜索数。默认值基于数据节点数和默认搜索线程池大小。
使用 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", "_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" : 0.5753642, "hits" : [ { "_index" : "my-index-000001", "_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" ] } } ] } } } } ] } }
跟踪分数编辑
当 collapse
与 sort
在某个字段上一起使用时,不会计算分数。将 track_scores
设置为 true 会指示 Elasticsearch 计算和跟踪分数。