我将值存储在Elasticsearch索引中的文档中 我需要对值进行一些日期操作,并返回一个布尔值,以便在过滤器中使用 该脚本涵盖了几行,我无法让它运行。
我已经编写了其他单一的脚本,但是我对Groovy知之甚少,而对弹性搜索却知之甚少。
我用脚本找到的每个样本都有一行,只有一行。
所以基本上我将如何使用这个完全有效的脚本
"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"
}
对于创建一个表示逻辑的只写一个班轮的想法,我并不感到生气,我可以看到更多这些内容在线下而且这一个相对简单,一个&#34一个班轮&#34;不会削减它。
这里的替代方法是在文档被索引之前对文档进行一些预处理,并向其中添加额外的数据。然而,这有一个缺点,因为它相当不灵活,我们需要重新索引所有数据来改变这些聚合,我们不会这样做。
答案 0 :(得分:10)
您只需要用分号分隔每个语句:
"script": {
"script": "isCompleted = doc['state'].value == 'completed'; preSLA = doc['lastStateUpdate'].value < doc['dueDate'].value; return isCompleted && preSLA;"
}
请确保不要在脚本字符串中添加换行符,因为它不是有效的JSON。
答案 1 :(得分:5)
如果您想将脚本分成多行,则必须使用"""
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