首页 > 解决方案 > 需要对文档内部数组对象进行聚合 - ElasticSearch

问题描述

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

{
  "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. 将文档按上一步中获得的总和按 desc 顺序排序
  4. 按 pid 对这些结果进行分组。

这意味着我们正在尝试通过特定 cid/mid 的日期范围内的销量(销售数量)总和来获得顶级产品。

这里PID是产品ID,MID是商家ID,CID是品类ID

标签: elasticsearchelasticsearch-aggregationelasticsearch-query

解决方案


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

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

这是以下查询。

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

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


推荐阅读