将Elasticsearch聚合的结果用作过滤器

4

我有一个按出席者分组的事件索引,每个事件都是一个嵌套文档,其中包括他们出席的时间戳以及其他信息,例如事件名称。

文档源本质上是这样的:

{
    "_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是否有一种方式可以将文档聚合应用为过滤器?
1个回答

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
            }
        }
    }
}

但是如果您还想进行文档内聚合,我认为您需要在客户端进行后处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接