elasticsearch(es)如何获取某个字段的所有不同的值及其对应的个数?
解决方法
针对如上需求,可以使用 elasticsearch 聚合(aggs)功能中的桶聚合模块,其中提供了 Terms Aggregation 子模块,Terms Aggregation 用于词项的分组聚合。最为经典的用例是获取 X 中最频繁(top frequent)的 term filed value,其中 X 是文档中的某个字段,具体示例如下:
{
"aggs": {
"word_cnt terms": {
"terms": { // terms 聚合 关键字
"field": "word_cnt",
"size" : 500,
......
}
}
}
}
返回类似如下:
{
"took": 152,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 940089,
"max_score": 0,
"hits": []
},
"aggregations": {
"word_cnt terms": {
"doc_count_error_upper_bound": 25,
"sum_other_doc_count": 22718,
"buckets": [
{
"key": 0,
"doc_count": 6723
},
{
"key": 100,
"doc_count": 4674
},
{
"key": 98,
"doc_count": 4582
},
{
"key": 103,
"doc_count": 4557
},
{
"key": 90,
"doc_count": 4511
}
...
]
}
}
}
其中,key 对应不同的值,doc_count 对应文档个数,默认情况下按照文档的个数降序,即 "order": { "_count": "asc" },如果要根据文档个数升序,示例如下:
{
"aggs": {
"word_cnt terms": {
"terms": { // terms 聚合 关键字
"field": "word_cnt",
"size" : 500,
"order": { "_count": "asc" }
......
}
}
}
}