一、top_hits + 聚合统计agg
GET example/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"target_id": "14016237"
}
}
]
}
},
"_source": [
"id",
"title"
],
"aggs": {
"phone_count": {
"terms": {
"field": "user_id"
}
}
}
}
从查询结果中摘取一部分:
{
"aggregations": {
"phone_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 20073846,
"doc_count": 2
},
{
"key": 20036806,
"doc_count": 1
},
{
"key": 23001854,
"doc_count": 1
},
{
"key": 23004000,
"doc_count": 1
}
]
}
}
}
二、es5以后的新特性collapse(字段折叠)
查询语句参考:
GET example/_search
{
"query": {
"bool": {
"must": [],
"filter": [
{
"term": {
"target_id": "14016237"
}
}
]
}
},
"_source": [
"id",
"user_id",
"expend_type",
"@timestamp"
],
"size": "15",
"collapse": {
"field": "user_id", //按user_id字段进行折叠
"inner_hits": {
"name": "expend_list", //查看用户信息结果键名
"size":1, //每个折合集文档数
"sort":[{"id":"asc"}] //每个折合集文档排序规则 "_source": [] //文档的字段
}
},
"sort":[{"id":"desc"}]
}
说明:inner_hits是用于针对折叠字段(这里是user_id重复的数据)筛选排序而指定的规则,其中:name相当于别名,size是返回的折叠集结果数量,sort是针对user_id重复的数据根据指定规则来进行排序。
从查询结果中摘取一部分:
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 15,
"successful" : 15,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 6,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{ ...
"inner_hits" : {
"expend_list" : {
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "example",
"_type" : "_doc",
"_id" : "7840914",
"_score" : null,
"_source" : {
"target_id" : 14016237,
"user_id" : 20073846,
"id" : 7840914,
"time" : 1673493919
},
"sort" : [
7840914
]
},
{
"_index" : "example",
"_type" : "_doc",
"_id" : "7840916",
"_score" : null,
"_source" : {
"id" : 7840916, 67,
"time" : 1673494355,
"user_id" : 20073846,
"target_id" : 14016237
},
"sort" : [
7840916
]
}
]
}
}
}
} ...
]
}
}
三、总结
collapse 允许基于字段对结果进行折叠。折叠操作是通过每个选择每个折叠键的顶部文档(top hits)来实现的。
不需要每次都在完整的结果集上对为每个折叠主键计算实际的 doc values 值,只对 top hits 这小部分数据操作就可以,因此和 term agg 相比要节省很多内存。
使用collapse注意事项:
1)响应结果中的hits总数表示匹配的文档总数而不是折叠的,去重后的聚合总数是未知的。
2)用于折叠的字段必须是单值的keyword或numeric字段并开启doc_values(文档值)。
评论