反向嵌套聚合总和

时间:2015-01-28 21:36:44

标签: elasticsearch mapping aggregation

我正在尝试按城市列出顶级旅行者。映射就是这个

{
  "log" : {
    "mappings" : {
      "travels" : {
        "_ttl" : {
          "enabled" : true,
          "default" : 7776000000
        },
        "properties" : {
          "_type" : {
            "type" : "string"
          },
          "date" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "traveler" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "cities" : {
            "type" : "nested",
            "properties" : {
              "count" : {
                "type" : "integer"
              },
              "name" : {
                "type" : "integer"
              }
            }
          }
        }
      }
    }
  }
}

我设法使用反向嵌套聚合,但我无法弄清楚汇总聚合的位置。我做的是

{
  "aggs":{
    "travels":{
      "nested":{
        "path":"cities"
      },
      "aggs":{ 
        "top_ids":{ 
          "terms":{
            "shard_size":0, 
            "field":"cities.name"
          },
          "aggs":{
            "cities_to_traveler":{
              "reverse_nested":{},
              "aggs":{
                "top_travelers":{
                  "terms":{
                    "field":"traveler"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

我该怎么做?如果我能提供更多代码,请告诉你。

编辑:我想总结城市嵌套字段中的字段数。

1 个答案:

答案 0 :(得分:1)

在每个聚合嵌套级别,您可以声明多个聚合。

在您的情况下,如果您想要计算每个城市的点数,您可以将sum汇总声明为与cities_to_traveler相同的级别,如下所示:

{
  "aggs": {
    "travels": {
      "nested": {
        "path": "cities"
      },
      "aggs": {
        "top_ids": {
          "terms": {
            "shard_size": 0,
            "field": "cities.name"
          },
          "aggs": {
            "cities_to_traveler": {
              "reverse_nested": {},
              "aggs": {
                "top_travelers": {
                  "terms": {
                    "field": "traveler"
                  }
                }
              }
            },
            "total": {
              "sum": {
                "field": "cities.count"
              }
            }
          }
        }
      }
    }
  }
}

对于每个城市,您将拥有所有旅行者的总数。

但是,我不确定这正是你想要的:我怀疑你想要每个城市,旅行者按照他们前往这个特定城市的次数计算。

在这种情况下,您可以查看top_hits聚合,按cities.countdocumentation here)排序结果。