Elasticsearch Cardinality Aggregation给出了完全错误的结果

时间:2014-12-12 19:25:27

标签: elasticsearch aggregation cardinality

我正在ES索引中保存网站的每个页面视图,其中每个页面都由 entity_id 识别。 我需要获取自给定时间点以来唯一页面浏览量的总数。 我有以下映射:

{
   "my_index": {
      "mappings": {
         "page_views": {
            "_all": {
               "enabled": true
            },
            "properties": {
               "created": {
                  "type": "long"
               },
               "entity_id": {
                  "type": "integer"
               }
            }
         }
      }
   }
}

根据Elasticsearch文档,这样做的方法是使用基数聚合。 这是我的搜索请求:

GET my_index/page_views/_search
{
  "filter": {
    "bool": {
      "must": [
        [
          {
            "range": {
              "created": {
                "gte": 9999999999
              }
            }
          }
        ]
      ]
    }
  },
  "aggs": {
    "distinct_entities": {
      "cardinality": {
        "field": "entity_id",
        "precision_threshold": 100
      }
    }
  }
}

请注意,我以后使用了时间戳,因此不会返回任何结果。 我得到的结果是:

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 0,
      "max_score": null,
      "hits": []
   },
   "aggregations": {
      "distinct_entities": {
         "value": 116
      }
   }
}

我不明白唯一网页访问次数是多少116,因为搜索查询根本没有网页访问次数。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的聚合返回基数的全局值。如果您希望它只返回过滤集的基数,那么您可以使用filter aggregation的一种方法,然后将基数聚合嵌套在其中。为了清楚起见,省略了过滤后的查询(您可以轻松地将其添加回来),我尝试的查询看起来像:

curl -XPOST "http://localhost:9200/my_index/page_views/_search " -d'
{
   "size": 0, 
   "aggs": {
      "filtered_entities": {
         "filter": {
            "bool": {
               "must": [
                  [
                     {
                        "range": {
                           "created": {
                              "gte": 9999999999
                           }
                        }
                     }
                  ]
               ]
            }
         },
         "aggs": {
            "distinct_entities": {
               "cardinality": {
                  "field": "entity_id",
                  "precision_threshold": 100
               }
            }
         }
      }
   }
}'

返回:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 4,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "filtered_entities": {
         "doc_count": 0,
         "distinct_entities": {
            "value": 0
         }
      }
   }
}

以下是您可以使用的一些代码:

http://sense.qbox.io/gist/bd90a74839ca56329e8de28c457190872d19fc1b

顺便说一下,我使用了Elasticsearch 1.3.4。