需要在文档内部数组对象上聚合-ElasticSearch

时间:2018-11-28 03:38:32

标签: elasticsearch elasticsearch-aggregation elasticsearch-query

我正在尝试对以下文档进行汇总

{
  "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. 对所有文档的中位数和/或cid进行过滤
  2. 过滤过去7天的data.date范围,并对每个pid超出该范围的data.vol求和
  3. 将文档按照上一步中获得的总和按desc顺序排序
  4. 将这些结果按pid分组。

这意味着我们正在尝试根据特定CID /中位数的日期范围内的销量(销售数量)的总和来获得顶级产品。

此处的PID是指产品ID, MID是指商家ID, CID是指此处的类别ID

2 个答案:

答案 0 :(得分:1)

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

然后,您可以在过滤器中使用范围查询,并在mid/cid上使用术语过滤器来过滤数据。一旦获得正确的数据集,就可以在pid的总和之后进行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"
                    }
                }
            }
        }
    }
}

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

答案 1 :(得分:0)

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

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