【问题标题】:Need aggregation on document inner array object - ElasticSearch需要对文档内部数组对象进行聚合 - ElasticSearch
【发布时间】:2019-04-29 21:45:23
【问题描述】:

我正在尝试对以下文档进行聚合

{
  "pid": 900000,
  "mid": 9000,
  "cid": 90,
  "bid": 1000,
  "gmv": 1000000,
  "vol": 200,
  "data": [
    {
      "date": "25-11-2018",
      "gmv": 100000,
      "vol": 20
    },
    {
      "date": "24-11-2018",
      "gmv": 100000,
      "vol": 20
    },
    {
      "date": "23-11-2018",
      "gmv": 100000,
      "vol": 20
    }
  ]
}

这里需要做的分析是:

  1. 过滤所有文档的 mid 或/和 cid
  2. 过去 7 天的 data.date 过滤范围和每个 pid 在该范围内的 data.vol 总和
  3. 按照上一步获得的总和对文档进行降序排序
  4. 按 pid 对这些结果进行分组。

这意味着我们试图在特定 cid/mid 的日期范围内按总销量(售出数量)获得顶级产品。

这里的PID是指产品ID, MID这里指的是商家ID, CID在这里指的是类别ID

【问题讨论】:

  • 您能否也显示您的映射(即datanested 类型)?
  • 数据字段应该映射为嵌套类型。然后,您可以创建 bool 查询来过滤 mid 和 cid,并有一个嵌套查询来过滤 data.date 字段。最后你需要 pid 上的术语聚合
  • { "mappings": {"_doc": {"properties": {"pid": {"type": "integer"}, "mid": {"type": "integer"}, "cid": {"type": "integer"}, "bid": {"type": "integer"}, "gmv": {"type": "integer"}, "vol": {"type": "integer"}, "data": {"properties": {"date": {"type": "date", "format": "yyyy-MM-dd"}, "gmv": {"type": "integer"}, "vol": {"type": "integer"} } } } } } }

标签: elasticsearch elasticsearch-aggregation elasticsearch-query


【解决方案1】:

首先,您需要更改映射以在嵌套字段上运行查询。 将字段“data”的类型更改为“嵌套”。

然后您可以使用过滤器中的范围查询以及mid/cid 上的术语过滤器来过滤数据。获得正确的数据集后,您可以在 vol 的总和上进行子聚合之后在 pid 上进行聚合。

这是下面的查询。

{
    "query": {
        "bool": {
            "filter": [
                {
                    "bool": {
                        "must": [
                            {
                                "range": {
                                    "data.date": {
                                        "gte": "28-11-2018",
                                        "lte": "25-11-2018"
                                    }
                                }
                            },
                            {
                                "must": [
                                    {
                                        "terms": {
                                            "mid": [
                                                "9000"
                                            ]
                                        }
                                    }
                                ]
                            }
                        ]
                    }
                }
            ]
        }
    },
    "aggs": {
        "AGG_PID": {
            "terms": {
                "field": "pid",
                "size": 0,
                "order": {
                    "TOTAL_SUM": "desc"
                },
                "min_doc_count": 1
            },
            "aggs": {
                "TOTAL_SUM": {
                    "sum": {
                        "field": "data.vol"
                    }
                }
            }
        }
    }
}

您可以相应地修改查询。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    请为每个“pid”桶找到按“vol”排序的嵌套聚合查询。您可以在查询部分添加任意数量的过滤器。

    { "size": 0, "query": { "bool": { "must": [ { "term": { "mid": "2" } } ] } }, "aggs": { "top_products_sorted_by_order_volume": { "terms": { "field": "pid", "order": { "nested_data_object>order_volume_by_range>order_volume_sum": "desc" } }, "aggs": { "nested_data_object": { "nested": { "path": "data" }, "aggs": { "order_volume_by_range": { "filter": { "range": { "data.date": { "gte": "2018-11-26", "lte": "2018-11-27" } } }, "aggs": { "order_volume_sum": { "sum": { "field": "data.ord_vol" } } } } } } } } } }

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2014-06-17
      相关资源
      最近更新 更多