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 关键字来检查实体是不是存在?

堆栈警报中的 Elasticsearch 查询不存在

Elasticsearch如何在Elasticsearch中查找相似的术语

初识elasticsearch

检查文本中是不是存在大量关键字