【问题标题】:ES Aggregation query to fetch parent docs based on conditions applied on aggregation results of child docs in ES?ES 聚合查询根据应用于 ES 中子文档聚合结果的条件获取父文档?
【发布时间】:2020-12-30 09:32:36
【问题描述】:

我正在使用 ES v7.3,并且我的索引中有父子映射,我想根据应用于子文档的一些聚合结果来限定我的索引中的父文档,但我不能这样做,这里是参考我需要的东西...

索引映射:

PUT example
{
  "mappings": {
    "properties": {
      "join": {
        "type": "join",
        "relations": {
          "user": "session"
        }
      }
    }
  }
}

父文档:

PUT example/_doc/1
{
  "join": {
    "name": "user"
  },
  "type": "identify",
  "device": "xx"
  "profileId": "1052210",
  "updatedAt": "2020-12-30T17:06:22.851Z"
}

第一个儿童文档:

PUT example/_doc/2?routing=1
{
  "join": {
    "name": "session",
    "parent": "1"
  },
  "page_view_count": 10,
  "creation_date": "2020-12-30T13:45:37.851Z"
}

第二个子文档:

PUT example/_doc/3?routing=1
{
  "join": {
    "name": "session",
    "parent": "1"
  },
  "page_view_count": 20,
  "creation_date": "2020-12-30T13:45:37.851Z"
}

要求:

  1. 过去 7 天内 page_view_count > 25 的用户,因此我们想汇总子文档中的 page_view_count 并检查它们的总和是否 > 25,如果满足条件,那么我们应该得到父文档作为响应否则不会。

注意:这些子文档是针对每个用户会话形成的,因此计数会保存在会话明智的 ES 文档中。

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    这是一种只返回 profileId 的解决方案:

    POST example/_search
    {
      "size": 0, 
      "aggs": {
        "users": {
          "terms": {
            "field": "profileId.keyword",
            "size": 10
          },
          "aggs": {
            "sessions": {
              "children": {
                "type" : "session" 
              },
              "aggs": {
                "last_7_days": {
                  "filter": {
                    "range": {
                      "creation_date": {
                        "gte": "now-7d",
                        "lte": "now"
                      }
                    }
                  },
                  "aggs": {
                    "page_view_count": {
                      "sum": {
                        "field": "page_view_count"
                      }
                    }
                  }
                }
              }
            },
            "page_view_count_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "viewCount": "sessions > last_7_days > page_view_count"
                },
                "script": "params.viewCount >= 25"
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 是否支持聚合在 ES 中与滚动一起运行,我不这么认为,因为我滚动了块大小为 10k 的结果文档,但是使用这个 bucket_selector 聚合我不认为这可以完成了吗??
    • 我不认为它受支持。也许你可以在他们的 (elasticsearch) github repo 上询问。
    • 是否有任何其他方法可以对聚合结果进行分页,因为将有数十万个符合条件的文档,并且在同时应用条件的子文档中也会保留几个这样的计数,我没有认为这个解决方案根据我的要求是可行的,你能建议我一种不同的方法,我可以对我的架构进行一些更改并存储会话明智的计数,这样我就可以根据日期范围查询它们而不对它们执行任何聚合.
    • 好吧,请问另一个问题(我认为在这里回答了连接聚合),以了解如何使用连接聚合来避免这个用例,以便能够使用滚动(请参考这个问题/答案)。我要记住的一件事是,您可以对会话文档进行后处理,更新相关的父对象,这样您就可以使用计数过滤那些用户对象,但可能很复杂。
    • 关于这个用例,您正在寻找与流相关的解决方案,考虑使用 kafka,您可以轻松地计算时间窗口或范围等功能。
    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2020-08-02
    • 2018-07-14
    • 2018-04-23
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多