我创建了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?
答案 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": {}
}
}
}
}
希望这有帮助!!谢谢