Kibana + Elasticsearch 如何统计字段的唯一值数量(去重计数)?
统计字段唯一值(如独立访客数)用 Cardinality 聚合:Kibana 可视化中选 Unique Count 聚合类型,或 DSL 写 cardinality agg。注意它是近似算法,精度可控。本文给出两种操作与精度说明。
用 Cardinality(基数)聚合:Kibana 可视化编辑器里选聚合类型「Unique Count」、选目标字段即可;等价 DSL 是 cardinality 聚合。它是 HyperLogLog++ 近似算法,默认误差率约 5% 以内。
Kibana 可视化操作
- 新建可视化(如 Metric 大数字);
- 聚合类型选 Unique Count;
- Field 选目标字段(如
user_id.keyword)——注意要用 keyword 子字段,text 字段不能聚合; - 保存加到仪表盘。
DSL 查询
GET /logs-*/_search
{
"size": 0,
"aggs": {
"unique_users": {
"cardinality": { "field": "user_id.keyword" }
}
}
}
精度说明
Cardinality 用 HLL++ 近似算法换取内存效率:默认精度阈值下误差很小,可通过 precision_threshold(最大 40000)调高:
"cardinality": { "field": "user_id.keyword", "precision_threshold": 40000 }
要精确值只能脚本遍历,代价极高——生产上近似即可。
观测云对照
观测云 DQL 提供去重计数函数,在查看器与看板中对任意字段直接做独立值统计,无需关心字段类型(不分 text/keyword 之惑)。
常见问题(FAQ)
Q:选不到目标字段? 字段是 text 类型——改用它的 .keyword 子字段,或调整索引 mapping。
Q:能按天分组看每天的 UV 吗? 可以,外层套 Date Histogram 聚合即可。