我有一个事件索引,这些事件由参加活动的个人分组,每个活动都是一个嵌套文档,其中包含参加活动的时间戳以及其他信息,例如活动名称。
doc来源基本上是这样的:
{
"_id" : 1,
"events" : [
{
"name" : "example event", // keyword type
"eventDatetime" : "2018-02-26 04:02:57" // date type
},
{
"name" : "other example event",
"eventDatetime" : "2017-01-01 12:00:01"
},
{
"name" : "final example event",
"eventDatetime" : "2016-06-12 12:00:00"
}
]
}
我想查询搜索API以回答以下问题:“查找2016年参加过3次以上活动的所有人”。基本上相当于SQL having count(*) > 3
子句。查询的日期范围是用户定义的,因此在索引时预先计算字段是非启动的。我们需要能够滚动浏览所有文档结果。索引大小为数亿,因此应用程序层的任何后处理都不是一个可行的解决方案。
如果有必要,可以重新构建文档格式以运行此查询,但任何格式都需要按个人分组,因为我们可能同时查询文档中的其他字段,例如年龄和其他具有自己时间戳的活动,因此将事件本身作为主要文件是不可行的。
Elasticsearch是否有办法将文档聚合实际应用为过滤器?
答案 0 :(得分:0)
如果您正在寻找跨文档的聚合(即每个用户的多个文档),这样的事情应该起作用
GET /_search
{
"_source": false,
"query": {
"nested" : {
"path" : "events",
"query" : {
"range" : {
"events.eventDatetime" :{
"gte": "01/01/2016",
"lte": "12/31/2016",
"format": "MM/dd/yyyy"
}
}
}
}
},
"aggs":{
"user_event_count":{
"terms":{
"field": "id",
"min_doc_count":4
}
}
}
}
但是,如果您还想要进行文档聚合,则必须在客户端发布流程,我认为