使用elasticsearch计算不同的值

时间:2014-07-09 16:15:50

标签: elasticsearch aggregation facet

我正在学习弹性搜索,并希望计算不同的值。到目前为止,我可以计算值,但不是很明显。

以下是示例数据:

curl http://localhost:9200/store/item/ -XPOST -d '{
  "RestaurantId": 2,
  "RestaurantName": "Restaurant Brian",
  "DateTime": "2013-08-16T15:13:47.4833748+01:00"
}'

curl http://localhost:9200/store/item/ -XPOST -d '{
  "RestaurantId": 1,
  "RestaurantName": "Restaurant Cecil",
  "DateTime": "2013-08-16T15:13:47.4833748+01:00"
}'

curl http://localhost:9200/store/item/ -XPOST -d '{
  "RestaurantId": 1,
  "RestaurantName": "Restaurant Cecil",
  "DateTime": "2013-08-16T15:13:47.4833748+01:00"
}'

到目前为止我尝试了什么:

curl -XPOST "http://localhost:9200/store/item/_search" -d '{
  "size": 0,
  "aggs": {
    "item": {
      "terms": {
        "field": "RestaurantName"
      }
    }
  }
}'

输出:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.0,
    "hits": []
  },
  "aggregations": {
    "item": {
      "buckets": [
        {
          "key": "restaurant",
          "doc_count": 3
        },
        {
          "key": "cecil",
          "doc_count": 2
        },
        {
          "key": "brian",
          "doc_count": 1
        }
      ]
    }
  }
}

如何将cecil计为1而不是2

4 个答案:

答案 0 :(得分:6)

您必须使用@coder中提到的基数选项,您可以在doc

中找到
$ curl -XGET "http://localhost:9200/store/item/_search" -d'
{
"aggs" : {
    "restaurant_count" : {
        "cardinality" : {
            "field" : "RestaurantName",
            "precision_threshold": 100, 
            "rehash": false 
            }
          }
         }
}'

这对我有用......

答案 1 :(得分:4)

答案 2 :(得分:0)

虽然存在非确定性计数,但ElasticSearch中不支持不同的计数。在结果中使用“terms”聚合和计数桶。请参阅Count distinct on elastic search 问题。

答案 3 :(得分:0)

我现在为原作者回答这个问题为时已晚,但对于任何面临同样问题并到达这里的人来说,我的回答可能会有所帮助。

ES 提供 Cardinality 以确保获得不同的计数,但它不准确。为了准确,可以使用适当的解决方案。我写了一篇关于此的文章可能会有所帮助:Accurate Distinct Count and Values from Elasticsearch