在script_field值上使用elasticsearch聚合?

cor*_*foo 5 elasticsearch

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

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": {"match_all": {}}
                }
            }
        }
    },
    "script_fields":{
        "my_field":{
            "script_id":"my_field_calculator",
            "lang" : "groovy",
            "params": {}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,我看到每个都有一个fields包含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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

查询运行得很好,我仍然在每个字段中看到我的计算结果,但是aggregations对象包含一个键,里面counts_by_my_field有一个空buckets数组.

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

cor*_*foo 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": {}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)