带嵌套和反向嵌套的elasticsearch聚合

1sbrub3j  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(0)|浏览(230)

假设文档集合如下所示:

{
    "product_id": "11111111-0000-0000-0000-111111111111",
    "product_name": "Product A",
    "date": "2020-11-25",
    "sold_in_countries": [
      {
        "name": "Country A",
        "count": 100
      },
      {
        "name": "Country B",
        "count": 200
      }
    ]
}

我想列出:对于每个国家,销售前5名的产品是什么(基于国家对象内相应“计数”的总和)。
由于“name”、“count”在嵌套对象中,我们需要一个嵌套聚合。但是“产品名称”不是,因此我们需要“反向嵌套”。我最终得到了:

"aggs": {
    "country_name": {
      "nested": {
        "path": "sold_in_countries"
      },
      "aggs": {
        "country_name": {
          "terms": {
            "field": "sold_in_countries.name",
            "size": 5,
            "order": {
              "sale_count": "desc"
            }
          },
          "aggs": {
            "sale_count": {
              "sum": {
                "field": "sold_in_countries.count"
              } 
            },
            "product_name": {
              "reverse_nested": {},
              "aggs": {
                "product_name": {
                  "terms": {
                    "field": "product_name.keyword",
                    "order": {
                      "sale_count": "desc"
                    }
                  },
                  "aggs": {
                    "sale_count": {
                      "nested": {
                        "path": "sold_in_countries"
                      },
                      "aggs": {
                        "sale_count": {
                          "sum": {
                            "field": "sold_in_countries.count"
                          }  
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

问题:第一个按国家/地区名称进行的聚合认为“销售计数”是正确的(国家/地区a为100,国家/地区b为200),而第二个按产品名称进行的聚合认为“销售计数”是国家/地区对象中所有“计数”的总和(300)。怎么办?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题