Elasticsearch - 如何检查关键存在的脚本查询参数?
Elasticsearch - how to check for key exist script query parameters?
有什么办法return没有相应的值就null吗?
示例)由于参数没有 field4 值,我希望将空值 returned 到 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,这需要安装额外的插件。
如果没有值,如何获取空值而不导致错误?
谢谢
你有一个 boolean value called empty
指示你文档是否有这样的字段。
所以你应该这样做
"inline": "def syn = field4 ?: 'dummy'; return (doc[syn].empty) ? null : doc[syn].value;"
更新: 如果我们知道脚本 class 名称,检测 Groovy 中缺少的参数变量是微不足道的。但是由于脚本 class 是动态创建的(例如 e5ce2464b456f9c0fa360269abc927e65998ecf7
),所以这个过程一点也不简单。避免这种情况的一种方法是在您的代码周围添加一个 try/catch 块,这样代码可能会失败但至少我们可以捕获它,基本上是这样的:
"inline": "try { def syn = field4; return (doc[syn].empty) ? null : doc[syn].value; } catch (e) { return null } "
但是,ES introduced some security hardening and class whitelisting for scripting in 2.2. One way to achieve this is to whitelist 在您的 .java.policy
文件中存在一些异常 class,如下所示:
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";
};
有什么办法return没有相应的值就null吗?
示例)由于参数没有 field4 值,我希望将空值 returned 到 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,这需要安装额外的插件。
如果没有值,如何获取空值而不导致错误?
谢谢
你有一个 boolean value called empty
指示你文档是否有这样的字段。
所以你应该这样做
"inline": "def syn = field4 ?: 'dummy'; return (doc[syn].empty) ? null : doc[syn].value;"
更新: 如果我们知道脚本 class 名称,检测 Groovy 中缺少的参数变量是微不足道的。但是由于脚本 class 是动态创建的(例如 e5ce2464b456f9c0fa360269abc927e65998ecf7
),所以这个过程一点也不简单。避免这种情况的一种方法是在您的代码周围添加一个 try/catch 块,这样代码可能会失败但至少我们可以捕获它,基本上是这样的:
"inline": "try { def syn = field4; return (doc[syn].empty) ? null : doc[syn].value; } catch (e) { return null } "
但是,ES introduced some security hardening and class whitelisting for scripting in 2.2. One way to achieve this is to whitelist 在您的 .java.policy
文件中存在一些异常 class,如下所示:
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";
};