对于每个国家/颜色/品牌组合,请在elasticsearch中查找项目数量的总和

时间:2015-05-05 21:03:53

标签: elasticsearch

这是我在elasticsearch中编入索引的数据的一部分:

{
  "country" : "India",
  "colour" : "white",
  "brand" : "sony"
  "numberOfItems" : 3
}

我想根据每个国家/地区,每个颜色和每个品牌获得numberOfItems的总和。有没有办法在elasticsearch中做到这一点?

2 个答案:

答案 0 :(得分:2)

以下内容应该让您直接回答。 确保在使用脚本之前启用脚本。

{
  "aggs": {
    "keys": {
      "terms": {
        "script": "doc['country'].value + doc['color'].value + doc['brand'].value"
      },
      "aggs": {
        "keySum": {
          "sum": {
            "field": "numberOfItems"
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

要获得单个结果,您可以将sum aggregation应用于带有术语(术语)过滤器的过滤查询,例如:

{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "country": "India"
                } 
            }
        }
    },
    "aggs": {
        "total_sum": {
            "sum": {
                "field": "numberOfItems"
            }
        }
    }
}

要通过数据一次性获取所有国家/颜色/品牌的统计信息,您可以使用以下查询和3个多桶聚合,每个聚合包含一个单桶总和sub-aggregation

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "countries": {
            "terms": {
                "field": "country"
            },
            "aggs": {
                "country_sum": {
                    "sum": {
                        "field": "numberOfItems"
                    }
                }
            }
        },
        "colours": {
            "terms": {
                "field": "colour"
            },
            "aggs": {
                "colour_sum": {
                    "sum": {
                        "field": "numberOfItems"
                    }
                }
            }
        },
        "brands": {
            "terms": {
                "field": "brand"
            },
            "aggs": {
                "brand_sum": {
                    "sum": {
                        "field": "numberOfItems"
                    }
                }
            }
        }
    }
}