提问者:小点点

日期直方图ElasticSearch中的反向嵌套聚合


我在日期直方图中组合来自不同级别的数据时遇到了一些问题。弹性留档给出了一个示例,有助于处理直方图中的日期从当前嵌套级别检索并且聚合使用级别上的情况,因此reverse_nested有帮助。但是如果情况是镜像的怎么办?就像聚合使用当前嵌套级别并且日期生活在上层级别一样?

假设我有下一个数据结构:

  {
    "_source": {
      "order_uuid": "...",
      "created_at": "...",
      "status": "...",
      "subtotal": 100,
      "items": [
        {
          "item_id": 1,
          "price": 1000,
          "units": 1,
        }
      ],
    }
  }

我想要每个项目都有带有created_at字段的日期直方图。所以我想有这样的smth:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "items": {
      "nested": {
        "path": "items"
      },
      "aggs": {
        "data": {
          "terms": {
            "field": "items.item_id"
          },
          "aggs": {
            "reversed": {
              "aggs": {
                "sales_per_day": {
                  "date_histogram": {
                    "reverse_nested": {},
                    "field": "created_at", #<- not nested
                    "calendar_interval": "day",
                    "format": "yyyy-MM-dd",
                  },
                  "aggs": {
                    "units_sum": {
                      "sum": {"field": "items.units"} #<- nested
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

这个例子显然不起作用,因为你不能在date_histogram中使用reverse_nested(至少我不知道如何使用),但它给人的印象是我应该是什么。

有没有人对如何在不重新组织映射的情况下处理它有想法?想法很受欢迎。


共1个答案

匿名用户

您必须指定这样的东西。首先,您指定reverse_nested聚合,然后在子聚合中,您在未嵌套的字段上使用date_historgram

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "items": {
      "nested": {
        "path": "items"
      },
      "aggs": {
        "data": {
          "terms": {
            "field": "items.item_id"
          },
          "aggs": {
            "reversed": {
              "reverse_nested": {
              }, 
              "aggs": {
                "sales_per_day": {
                  "date_histogram": {
                    "field": "created_at",
                    "calendar_interval": "day"
                  },
                  "aggs": {
                    "units_sum": {
                      "sum": {"field": "items.units"}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}