Elasticsearch aggs Cardinality 问题

think2018 发布于 2016/06/21 14:34
阅读 2K+
收藏 0

我用以下query_body 聚合查询(APP用户行为分析系统),发现cardinality返回的数据有问题,

先简单描述下字段,供参考,

platform 平台,

region_id 地区id,

product_id 商品id,

pre_name 前驱事件name,

需求:首先根据以上四个字段分组统计,然后通过设备号(device_num)去重得到uv,

返回的数据,doc_count 是正确的,

但 cardinality 返回的基数(去重uv)的结果是错误的,有时甚至比总量 doc_count 还要高,

示例数据,

地区     商品id          商品名称   上级页面  事件次数(doc_count) 事件人数(uv)
深圳市 11181           女神          首页          249                          286
深圳市 11181           女神          首页          49                            62

请大牛帮忙看一下,query_body写的是否有问题,特别是cardinality,是否合理,

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "action_name": "detail"
          }
        }
      ]
    }
  },
  "aggs": {
    "report": {
      "terms": {
        "field": "platform"
      },
      "aggs": {
        "region_ids": {
          "terms": {
            "field": "region_id"
          },
          "aggs": {
            "product_ids": {
              "terms": {
                "field": "product_id"
              },
              "aggs": {
                "pre_names": {
                  "terms": {
                    "field": "pre_name"
                  },
                  "aggs": {
                    "uv": {
                      "cardinality": {
                        "field": "device_num"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

加载中
0
伯仁
伯仁
我也遇到了,数据的确不对。但我也没有找到原因
0
莫小醉
莫小醉

昨天晚上搞到凌晨1点终于解决了,cardinality有个参数 "precision_threshold": 100 ,100是个预设值,你的真实值小于100计算出来的值就是正确的,真实值大于100计算出来的值就是模糊的,100可以自定义。

{
    "aggs":{
        "author_count":{
            "cardinality":{
                "field":"author_hash",
                "precision_threshold":100
            }
        }
    }
}
参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html

0
梁瑶
非常感谢分享,正好也遇到了这个问题
0
duyi
duyi
ES中“去重"是基于基数计算的(HLL),会有误差的
0
smart152819
smart152819

夜行侠老师视频教学:es问题汇总
http://www.itjoin.org/
1、如何防止索引被删除
2、搜索的精准性控制
3、解决搜索中英文数字混合
4、搜索中in查询
5、安装问题
6、es源码内部是如何做到插件化扩展
7、统计时展示不全
8、搜索条件过多,内容过长报错
9、索引某一字段内容太大
10、自动补全设计
11、es的分布式如何实现RPC底层
12、es的分片机制
13、head插件的使用
14、es分片和副本级的是原理
15、如何做到只更新部分数据
16、数组在index中如何制定
17、es搜索结果窗口太大
18、group by里如何
19、es底层新增和删除的全过程
20、es底层检索的全过

返回顶部
顶部