Elasticsearch-如何检查键存在脚本查询参数



如果没有相应的值,有没有办法返回null?

示例(由于params没有field4值,我希望将null值返回给syn变量。

"aggs": {
"countries": {
"terms": {
"script": {
"params": {
"field1": "country",
"field2": "test",
"field3": "test"
},
"inline": "def syn = field4; if (syn == null) doc[country].value;"
}
}
}
}

目前,如果没有相应的值,总是会出现错误。

"caused_by": {
"type": "missing_property_exception",
"reason": "No such property: field1 for class: e5ce2464b456f9c0fa360269abc927e65998ecf7"
}

我正在使用groovy和elasticsearch版本2.2

我不能使用Python或JavaScript,这需要安装额外的插件。

如果没有值,如何在不引起错误的情况下获得null值?

感谢

您有一个名为empty的布尔值,它指示文档是否有这样的字段。

所以你应该这样做

"inline": "def syn = field4 ?: 'dummy'; return (doc[syn].empty) ? null : doc[syn].value;"

UPDATE:如果我们知道脚本类名,那么在Groovy中检测丢失的参数变量是微不足道的。但是,由于脚本类是动态创建的(例如e5ce2464b456f9c0fa360269abc927e65998ecf7(,它使得这个过程一点也不琐碎。规避这种情况的一种方法是在代码周围添加一个try/catch块,这样代码可能会失败,但至少我们可以捕获它,基本上是这样的:

"inline": "try { def syn = field4; return (doc[syn].empty) ? null : doc[syn].value; } catch (e) { return null } "

然而,ES在2.2中为脚本引入了一些安全强化和类白名单。实现这一点的一种方法是在.java.policy文件中列出一些Exception类,如下所示:

grant {
permission org.elasticsearch.script.ClassPermission "java.lang.Throwable";
permission org.elasticsearch.script.ClassPermission "java.lang.Exception";
permission org.elasticsearch.script.ClassPermission "groovy.lang.GroovyException";
};

最新更新