【发布时间】:2019-08-01 18:23:27
【问题描述】:
查询 Elasticsearch 以实现表示唯一访问者总数指标的日期直方图的最佳方法是什么?
考虑以下数据:
PUT /events
{
"mappings" : {
"_doc" : {
"properties" : {
"userId" : { "type" : "keyword" },
"eventDate" : { "type" : "date" }
}
}
}
}
POST /events/_bulk
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "1" } }
{"userId": "1","eventDate": "2019-03-04T13:40:18.514Z"}
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "2" } }
{"userId": "2","eventDate": "2019-03-04T13:46:18.514Z"}
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "3" } }
{"userId": "3","eventDate": "2019-03-04T13:50:18.514Z"}
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "4" } }
{"userId": "1","eventDate": "2019-03-05T13:46:18.514Z"}
{ "index" : { "_index" : "events", "_type" : "_doc", "_id" : "5" } }
{"userId": "4","eventDate": "2019-03-05T13:46:18.514Z"}
现在,如果我查询 userId 字段的基数,我会得到 4 个不同的访问者。
POST /events/_search
{
"size": 0,
"aggs": {
"visitors": {
"cardinality": {
"field": "userId"
}
}
}
}
但是,将文档分布在日期直方图上,我得到的总和为 5,因为两个存储桶中都有重复的 userId。
POST /events/_search
{
"size": 0,
"aggs": {
"visits_over_time": {
"date_histogram": {
"field": "eventDate",
"interval": "1d"
},
"aggs": {
"visitors": {
"cardinality": {
"field": "userId"
}
}
}
}
}
}
有没有办法过滤掉那些重复的值?实现这一目标的最佳方法是什么?
【问题讨论】:
-
嗨,我不确定我是否理解了这个问题:如果您按天对事件进行分组,那么 userId 1 在两个存储桶中是正确的
-
是的,但我需要每个 userId 在所有存储桶中只出现一次,即保留第一个 userId 出现。
-
你有没有免费的 X-path 包(有观察者)?
-
@LeBigCat 是的,这是一个选项。
-
已编辑答案以进行澄清,但我认为如果您只关心有多少而不关心单个用户,您需要一个不同的查询
标签: elasticsearch date-histogram