【问题标题】:Elastic Search: How to write multi statement scripts?Elastic Search:如何编写多语句脚本?
【发布时间】:2019-06-13 23:30:53
【问题描述】:

我将值存储在 Elasticsearch 索引的文档中。
我需要对这些值进行一些日期操作并返回一个布尔值以在过滤器中使用。
脚本覆盖了几行,我无法让它运行。

我编写了其他运行良好的单个脚本,但是我对 Groovy 知之甚少,对 Elastic 搜索知之甚少。

我可以通过脚本找到的每个示例都有一行且只有一行。

所以基本上我将如何使用这个完全有效的脚本

"script": {
    "script": "doc['state'].value == 'completed' && doc['lastStateUpdate'].value < doc['dueDate'].value"
    }

然后把它变成类似的东西

"script": {
    "script": "def isCompleted = doc['state'].value == 'completed' 
               def preSLA = doc['lastStateUpdate'].value < doc['dueDate'].value
               return isCompleted && preSLA"
    }

我对创建一个表达逻辑的只写一个衬里的想法并不生气,我可以看到更多这样的内容,虽然这个相对简单,但“一个衬里”不是不会剪掉它。

这里的替代方法是在文档被索引之前对其进行一些预处理,并向其添加额外的数据。但是,这样做的缺点是相当不灵活,我们需要重新索引所有数据以更改这些聚合,而我们宁愿不这样做。

【问题讨论】:

    标签: groovy elasticsearch


    【解决方案1】:

    您只需用分号分隔每个语句:

    "script": {
        "script": "isCompleted = doc['state'].value == 'completed'; preSLA = doc['lastStateUpdate'].value < doc['dueDate'].value; return isCompleted && preSLA;"
        }
    

    请确保不要在脚本字符串中添加换行符,因为它不是有效的 JSON。

    【讨论】:

    • 谢谢,如果您删除def,我会将其标记为正确答案(不适用于他们)。谢谢:)
    • 酷,完成,谢谢!可能你的脚本语言不时髦。
    • 嗨,我尝试了该脚本,但不起作用并返回编译错误。这是我关于这个stackoverflow.com/questions/51136214/…的问题
    【解决方案2】:

    如果你想把你的脚本分成多行,你必须用"""docs包围你的脚本

    `"query": {
        "function_score": {
          "script_score": {
            "script": {
              "lang": "painless",
              "source": """
                int total = 0;
                for (int i = 0; i < doc['goals'].length; ++i) {
                  total += doc['goals'][i];
                }
                return total;
              """
            }
          }
        }
      }
    }`
    

    更新:对于 Elasticsearch 的某些版本,source 应替换为 inline docs

    【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2019-03-12
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2016-08-30
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多