【问题标题】:Using result of Elasticsearch aggregation as a filter使用 Elasticsearch 聚合的结果作为过滤器
【发布时间】:2018-03-10 05:07:27
【问题描述】:

我有一个按参加活动的个人分组的活动索引,每个活动都是一个嵌套文档,其中包含他们参加的时间戳以及活动名称等其他信息。

文档来源基本上是这样的:

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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果您正在寻找跨文档的聚合(即每个用户多个文档),这样的事情应该可以工作

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

    但是,如果您还想要内部文档聚合,我认为您将不得不在客户端发布流程

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 2022-01-17
      • 1970-01-01
      • 2015-10-06
      • 2020-02-06
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多