使用父聚合中的参数进行子聚合脚本编制

时间:2015-01-09 09:32:50

标签: elasticsearch

有没有办法使用聚合桶的key值作为子聚合中的参数?

有一个索引:

{
    "id": 152,
    "description": "cool stuff",
    "datesWithTotal" : [
        {
            "date" : "2014-02-02T00:00:00",
            "total" : 47.2
        },
        {
            "date" : "2014-02-03T00:00:00",
            "total" : 51.2
        },
        {
            "date" : "2014-02-04T00:00:00",
            "total" : 56.4
        }
    ]
}

我想使用子聚合执行date_histogram聚合,该子聚合将根据当前parentbucket.key值执行某些操作

{
    "aggs": {
        "histo": {
            "date_histogram": {
                "field": "datesWithTotal.date",
                "interval": "1d"
            },
            "aggs": {
                "script-test": {
                    "scripted_metric": {
                        "init_script": "_agg['sum'] = 0",
                        "map_script": "_agg.sum += (PARENTBUCKET.KEY == 'somevalue' ? 1 : 0)",
                        "combine_script": "return _agg.sum"
                    }
                }
            }
        }
    }
}

我已经以这种方式使用了一些脚本,但每个脚本都没有使用父节点中的任何内容,只是普通的整数参数。

1 个答案:

答案 0 :(得分:0)

这只是一个想法。我已经快速测试了它,但无论出于何种原因,它都没有输出我认为应该的东西。也许它会给你一些进一步的想法,或者你可以让它以我迄今未能达到的方式运作:

{
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "datesWithTotal.date",
        "interval": "1d"
      },
      "aggs": {
        "doesIncludeDate": {
          "terms": {
            "script": "new Date(doc[\"datesWithTotal.date\"].value).format(\"yyyy-MM-dd\")",
            "valueType": "string",
            "include": {
              "pattern": "2014-02-04"
            }
          },
          "aggs": {
            "script-test": {
              "scripted_metric": {
                "init_script": "_agg['sum'] = 0",
                "map_script": "_agg.sum += 1",
                "combine_script": "return _agg.sum"
              }
            }
          }
        },
        "doesNotIncludeDate": {
          "terms": {
            "script": "new Date(doc[\"datesWithTotal.date\"].value).format(\"yyyy-MM-dd\")",
            "valueType": "string",
            "exclude": {
              "pattern": "2014-02-04"
            }
          },
          "aggs": {
            "script-test": {
              "scripted_metric": {
                "init_script": "_agg['sum'] = 0",
                "map_script": "_agg.sum += 0",
                "combine_script": "return _agg.sum"
              }
            }
          }
        }
      }
    }
  }
}

我们的想法是使用terms聚合与include和另一个termsexclude聚合,以获得与您的父存储桶密钥匹配的存储桶。对于匹配的用户,请将您的脚本与_agg.sum += 1一起用于其他用途_agg.sum += 0

当然,所有这些都是针对一个非常具体的脚本:日期是X还是不是。如果脚本更复杂,那么它将没有用处。我不认为你可以从脚本访问父键(或者我没有找到办法)。