在script_field值上使用elasticsearch聚合?

时间:2014-08-12 06:58:11

标签: elasticsearch

我创建了groovy脚本来计算新的字段值。然后我可以在查询中使用该脚本来使用script_fields参数计算新字段值。这是一个例子:

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": {"match_all": {}}
                }
            }
        }
    },
    "script_fields":{
        "my_field":{
            "script_id":"my_field_calculator",
            "lang" : "groovy",
            "params": {}
        }
    }
}

这很好用,我看到每个都有一个包含fields的{​​{1}}对象的结果。完善。

现在我想使用terms aggregation来获取此新字段值的每次出现的计数,如下所示:

my_field

查询运行得很好,我仍然会在每个字段中看到我的计算结果,但是{ "query": { "filtered": { "query": { "bool": { "must": {"match_all": {}} } } } }, "script_fields":{ "my_field":{ "script_id":"my_field_calculator", "lang" : "groovy", "params": {} } } "aggs": { "counts_by_my_field": { "terms": { "field": "my_field" } } } } 对象包含一个键aggregations,里面有一个空的counts_by_my_field数组。

我错过了什么?是否可以在聚合中使用script_fields?

2 个答案:

答案 0 :(得分:4)

虽然我无法使聚合使用script_field聚合,但我发现了另一种完成我希望做的事情的方法。事实证明,聚合将接受script_id配置,该配置可以在聚合期间计算脚本字段值。

以下是我使用script_id作为聚合的一部分的示例:

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": { "match_all": {}}
                }
            }
        }
    },
    "aggs": {
        "counts_by_my_field": {
            "terms": {
                "script_id": "my_field_calculator",
                "lang" : "groovy",
                "params": {}
            }
        }
    }
}

答案 1 :(得分:2)

这是不可能的,还没有。 script_fields 在聚合或方面放置为field时不起作用。

并且没有任何方法可以通过聚合访问脚本字段。见解释。

我深入研究了Elasticsearch实现代码,

这是Javadoc for,ValuesSourceAggregationBuilder#script()用于脚本的术语聚合。

  

设置生成值的脚本。如果脚本是   与字段一起配置(如{@link #field(String)}),然后        *此脚本将被视为{@code值脚本}。 值脚本将应用于提取的值   从        *字段数据(您可以使用{@code _value}保留变量在脚本中引用该值)。如果只有脚本   配置        *(并且旁边配置了no字段),然后脚本将负责生成将聚合的值。        *

这意味着,您无法将“script_id”发送到聚合。你只能这样做,

POST index/type/_search
{
   "aggs": {
      "name": {
         "terms": {
            "script": "_source.data[0]",
            "lang": "groovy",
            "params": {}
         }
      }
   }
}

希望这有帮助!!谢谢