在 script_field 值上使用弹性搜索聚合?
Posted
技术标签:
【中文标题】在 script_field 值上使用弹性搜索聚合?【英文标题】:Using elasticsearch aggregations on script_field values? 【发布时间】:2014-10-05 03:38:50 【问题描述】:我创建了 groovy 脚本来计算新的字段值。然后,我可以在我的查询中使用该脚本来使用script_fields
参数计算新字段值。这是一个例子:
"query":
"filtered":
"query":
"bool":
"must": "match_all":
,
"script_fields":
"my_field":
"script_id":"my_field_calculator",
"lang" : "groovy",
"params":
这工作得很好,我看到每个都有一个包含my_field
的fields
对象。完美的。
现在我想使用terms aggregation 来获取这个新字段值每次出现的计数,如下所示:
"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
,其中包含一个空的 buckets
数组。
我错过了什么?是否可以在聚合中使用 script_fields?
【问题讨论】:
【参考方案1】:这是不可能的,目前还没有。 script_fields 在聚合或构面中作为 field
放置时不起作用。
并且没有任何方法可以通过聚合访问脚本字段。见解释。
我深入研究了 Elasticsearch 的实现代码,
这是用于编写脚本的术语聚合使用的 ValuesSourceAggregationBuilder#script() 的 Javadoc。
设置生成值的脚本。如果脚本是 与字段一起配置(如在 @link #field(String) 中),然后 * 此脚本将被视为 @code value 脚本。 值脚本将应用于提取的值 从 * 字段数据(您可以使用 @code _value 保留变量在脚本中引用该值)。如果只有脚本 已配置 * (并且旁边配置了 no 字段),那么脚本将负责生成将被聚合的值。 *
这意味着,您不能将“script_id”发送到聚合。你只能这样做,
POST index/type/_search
"aggs":
"name":
"terms":
"script": "_source.data[0]",
"lang": "groovy",
"params":
希望这会有所帮助!!谢谢
【讨论】:
【参考方案2】:虽然我无法使聚合使用 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":
【讨论】:
以上是关于在 script_field 值上使用弹性搜索聚合?的主要内容,如果未能解决你的问题,请参考以下文章