elasticsearch - 使用从父聚合获取的参数的子聚合脚本

标签 elasticsearch

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

有一个像这样的索引:

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

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

最佳答案

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

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

我们的想法是使用一个带有includeterms 聚合和一个带有excludeterms 来获得与您的父存储桶键匹配或不匹配的存储桶。对于那些匹配的脚本,请将您的脚本与 _agg.sum += 1 一起使用,对于另一个,请使用 _agg.sum += 0

当然,所有这些都是针对您拥有的非常具体的脚本:日期是否为 X。如果脚本更复杂,它将没有用。而且我不认为您可以从脚本访问父 key (或者我还没有找到这样做的方法)。

关于elasticsearch - 使用从父聚合获取的参数的子聚合脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27857512/

相关文章:

c# - ElasticSearch:为什么索引中的所有文本字段都具有关键字类型?

ruby-on-rails - Rails Elasticsearch 错误 “The stack size specified is too small, Specify at least 160k Error: Could not create the Java Virtual Machine. ”

elasticsearch - 如何从Elasticsearch获得高于平均水平的价格?

elasticsearch - 在同一文本字段上同时使用术语和匹配查询?

elasticsearch - kibana可视化范围查询不起作用

lucene - 为什么路由不适用于 ElasticSearch Bulk API?

function - 如何使用ElasticSearch进一步 boost field_value_factor给出的分数?

sql - 查找半径重叠的Geopoint

javascript - 在ElasticSearch上的嵌套查询

elasticsearch - 如何使用 go 在 Elasticsearch 中按嵌套对象对文档进行排序?