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

Elasticsearch - how to check for key exist script query parameters?

有什么办法return没有相应的值就null吗?

示例)由于参数没有 f​​ield4 值,我希望将空值 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";
};