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" }
......
}
}
}
}