使用Elasticsearch聚合的结果作为过滤器

时间:2018-03-09 15:59:42

标签: elasticsearch

我有一个事件索引,这些事件由参加活动的个人分组,每个活动都是一个嵌套文档,其中包含参加活动的时间戳以及其他信息,例如活动名称。

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是否有办法将文档聚合实际应用为过滤器?

1 个答案:

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

但是,如果您还想要进行文档聚合,则必须在客户端发布流程,我认为