唯一的术语聚合计数

时间:2014-02-14 15:00:48

标签: elasticsearch

我想从我的数据集中计算字段的不同值。例如:

terms聚合给出了username出现的次数。我想只计算唯一用户名,而不是全部。

这是我的要求:

POST appzz/messages/_search
{
   "aggs": {
      "words": {
         "terms": {
            "field": "username"
         }
      }
   },
   "size": 0,
   "from": 0
}

是否有unique选项或类似内容?

4 个答案:

答案 0 :(得分:7)

您正在寻找Elasticsearch 1.1中添加的cardinality aggregation。它允许您请求这样的内容:

{
  "aggs" : {
      "unique_users" : {
          "cardinality" : {
              "field" : "username"
          }
      }
  }
}

答案 1 :(得分:2)

我们在最近的一次Elasticsearch聚会上与一位ES人员进行了长时间的讨论。简短的回答是不,没有。据他说,这不是很快就能预料到的。

实现这一目标的一个选择是获得所有条款(给出一个非常大的限制)并计算返回的条款数量,但它很昂贵,如果你有很多独特的术语则不是真的有效。

答案 2 :(得分:1)

@DerMiggel:我尝试将基数用于我的项目。令我惊讶的是我的本地系统总共转储了大约2,00,000个文档,我尝试使用precision_threshold为100,0和40,000(作为最大值)的基数。前两次,结果不同(分别为175和184)和40,000内存异常。与其他aggs相比,计算时间也很长。因此,我觉得基数实际上并不正确,并且在需要高精度和高精度时可能会使系统崩溃。

答案 3 :(得分:0)

我仍然是ES的新手,但是如果我找到你的话,你应该能够通过简单地计算响应中返回的桶数来获得答案吗? (见http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

注意,但是:相反与该文档现在所说的大小为0(“可以不限制通过设置大小返回的术语数量到了“”),我使用最新版本(现在为1.0.1)测试表明这不起作用! 相反,将大小设置为0将为您提供 0个桶!!! 如果您想获得,则应将(叹气)大小设置为某个任意高的数字而不是现在所有条款。

编辑:哎呀,我的坏!我只是重新阅读了doc,只是注意到那里的版本注释,并意识到这只是在1.1.0中出现?这个注释是过去时(“在1.1.0中添加”),这很令人困惑,但我猜1.1.0还没有发布....

哦,顺便说一下,你的网址似乎有问题?我希望你知道。