【问题标题】:Sub-aggregate a multi-level nested composite aggregation子聚合一个多级嵌套复合聚合
【发布时间】:2021-05-11 10:57:15
【问题描述】:

我正在尝试设置一个搜索查询,该查询应该通过多级嵌套字段组合聚合集合,并从该集合中给我一些子聚合指标。我能够按预期使用其存储桶获取复合聚合,但子聚合指标带有 0 用于所有存储桶。我不确定我是否未能正确指出子聚合应考虑哪些字段,或者是否应将其放置在查询的不同部分中。

我的收藏类似于以下内容:

{
  id: '32ead132eq13w21',
  statistics: {
    clicks: 123,
    views: 456
  },
  categories: [{ //nested type
    name: 'color',
    tags: [{ //nested type
      slug: 'blue'
    },{
      slug: 'red'
    }]
  }]
}

您可以在下面找到我迄今为止尝试过的内容。所有存储桶都带有 clicks 总和为 0,即使所有文档都有一个集合 clicks 值。

GET /acounts-123321/_search
{
  "size": 0,
  "aggs": {
    "nested_categories": {
     "nested": {
        "path": "categories"
     },
     "aggs": {
           "nested_tags": {
             "nested": {
                "path": "categories.tags"
              },
              "aggs": {
                "group": {
                  "composite": {
                     "size": 100,
                     "sources": [
                       { "slug": { "terms" : { "field": "categories.tags.slug"} }}
                     ]
                   },
                   "aggregations": {
                     "clicks": {
                       "sum": {
                         "field": "statistics.clicks"
                       }
                     }
                   }
                }
              }
            }
          }
       }
  }
}

到目前为止我的响应正文:

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1304,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "nested_categories" : {
      "doc_count" : 1486,
      "nested_tags" : {
        "doc_count" : 1486,
        "group" : {
          "buckets" : [
            {
              "key" : {
                "slug" : "red"
              },
              "doc_count" : 268,
              "clicks" : {
                "value" : 0.0
              }
            }, {
              "key" : {
                "slug" : "blue"
              },
              "doc_count" : 122,
              "clicks" : {
                "value" : 0.0
            },
            .....
          ]
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    为了使其正常工作,composite 聚合 would need to 中的所有源都位于相同的 nested 上下文中。

    我刚刚回复了something similar。提问者需要将嵌套值放在顶层。您面临着相反的挑战 - 鉴于 stats.clicks 字段 is 在顶层,您需要在 categories.tags 的每个条目中复制它,我怀疑这不会是可行的,因为您可能会不时更新这些统计信息……

    如果您可以跳过composite 方法并在没有它的情况下使用terms agg,您可以通过reverse_nested 跳回顶层来进行求和:

    {
      "size": 0,
      "aggs": {
        "nested_tags": {
          "nested": {
            "path": "categories.tags"
          },
          "aggs": {
            "by_slug": {
              "terms": {
                "field": "categories.tags.slug",
                "size": 100
              },
              "aggs": {
                "back_to_parent": {
                  "reverse_nested": {},
                  "aggs": {
                    "clicks": {
                      "sum": {
                        "field": "statistics.clicks"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    这也可以,但 won't offer pagination.


    澄清

    如果您需要color 过滤器,您可以这样做:

    {
      "size": 0,
      "aggs": {
        "categories_parent": {
          "nested": {
            "path": "categories"
          },
          "aggs": {
            "filtered_by_color": {
              "filter": {
                "term": {
                  "categories.name": "color"
                }
              },
              "aggs": {
                "nested_tags": {
                  "nested": {
                    "path": "categories.tags"
                  },
                  "aggs": {
                    "by_slug": {
                      "terms": {
                        "field": "categories.tags.slug",
                        "size": 100
                      },
                      "aggs": {
                        "back_to_parent": {
                          "reverse_nested": {},
                          "aggs": {
                            "clicks": {
                              "sum": {
                                "field": "statistics.clicks"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 非常感谢您的回答。这可能对我有用。我仍然不清楚在这种艰难的情况下如何进行过滤器聚合。如果我想过滤名称为color 的类别内的仅聚合标签怎么办?我应该在什么级别添加这样的聚合?
    • 没问题!我在我的答案中添加了这样一个过滤器示例。希望能帮助到你。嘿——这种高度嵌套的语法(不是双关语)一开始可能会让人不知所措,尤其是。对于来自火力基地背景的人。在我的 Elasticsearch Handbook 中,我尝试让此类主题更加清晰,我认为它会为您带来价值。 Let me know what other topics besides nested fields interest you 当手册可用时我会通知您!
    • 你好@joe-sorocin。同意,我刚刚开始使用 ES,它是一个完全不同的世界。在比较 firebase 和 ES 时,仍然学到了很多东西,并且有一些问题会很好地解决。我会确保在您的表格上添加一些想法。手册听起来是个好主意。同时,考虑到我的例子,我是否也可以按clicks 对聚合存储桶进行排序?我尝试在内部aggs 内部back_to_parent 中使用bucket_sort,但看起来这是不允许的。如果您希望我提出一个新问题来说明问题,请告诉我。
    • 不错!我确实在一两个项目中使用了 firebase,所以我会在手册中挤一些从 firebase 到 ES 的技巧! @bucket sort - 是的,一个新问题会更好。随意标记我。
    • 很高兴听到这个消息!与 firebase 相比,我最关心的是 ES 的数据模式设计级别。我们希望避免在 firebase 上使用数组作为结构,但由于 ES 数据索引的一些限制,据我所知,您不得不使用它。我刚刚发布了一个新问题。很想在那里收到你的来信。如果我的问题结构很好,或者您认为我应该在某些方面改进,请告诉我。 stackoverflow.com/questions/66294446/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2021-12-02
    • 2016-03-20
    • 1970-01-01
    • 2021-03-13
    • 2021-12-14
    • 2015-11-18
    相关资源
    最近更新 更多