Elasticsearch - 如何检查关键存在的脚本查询参数?
Posted
技术标签:
【中文标题】Elasticsearch - 如何检查关键存在的脚本查询参数?【英文标题】:Elasticsearch - how to check for key exist script query parameters? 【发布时间】:2022-01-06 21:55:48 【问题描述】:如果没有对应的值,有没有办法返回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,这需要安装额外的插件。
如果没有值,如何获取空值而不报错?
谢谢
【问题讨论】:
【参考方案1】:您有一个boolean value called empty
,它指示您文档是否有这样的字段。
所以你应该这样做
"inline": "def syn = field4 ?: 'dummy'; return (doc[syn].empty) ? null : doc[syn].value;"
更新:如果我们知道脚本类名,那么在 Groovy 中检测缺失的参数变量是很简单的。但是由于脚本类是动态创建的(例如e5ce2464b456f9c0fa360269abc927e65998ecf7
),它使得这个过程一点也不简单。避免这种情况的一种方法是在代码周围添加一个 try/catch 块,这样代码可能会失败,但至少我们可以捕获它,基本上是这样的:
"inline": "try def syn = field4; return (doc[syn].empty) ? null : doc[syn].value; catch (e) return null "
但是,ES introduced 2.2 中的脚本进行了一些安全强化和类白名单。实现此目的的一种方法是在您的.java.policy
文件中添加whitelist 一些异常类,如下所示:
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";
;
【讨论】:
发生同样的错误def syn = field4;
在检查导入之前,该部分似乎有错误。
哦,我明白你的意思了。让我更新我的答案
我已经更新了我的答案,你可以再试一次吗?抱歉,我无法测试它,因为我无法再安装 2.2,太旧了。
不工作发生同样的错误
好的,我做了更多研究并更新了我的答案。请试一试以上是关于Elasticsearch - 如何检查关键存在的脚本查询参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Data 中的 exists 关键字来检查实体是不是存在?