Groovy 弹性搜索:如何编写多语句脚本?
我将值存储在Elasticsearch索引中的文档中。Groovy 弹性搜索:如何编写多语句脚本?,groovy,elasticsearch,Groovy,elasticsearch,我将值存储在Elasticsearch索引中的文档中。 我需要对这些值进行一些日期操作,并返回一个布尔值,以便在筛选器中使用。 脚本包含了好几行,我无法运行它 我还编写了其他一些工作正常的脚本,但是我对Groovy知之甚少,对弹性搜索知之甚少 我能找到的每一个脚本样本都有一行,而且只有一行 那么基本上,我该如何处理这个完全有效的脚本呢 "script": { "script": "doc['state'].value == 'completed' && doc['last
我需要对这些值进行一些日期操作,并返回一个布尔值,以便在筛选器中使用。
脚本包含了好几行,我无法运行它 我还编写了其他一些工作正常的脚本,但是我对Groovy知之甚少,对弹性搜索知之甚少 我能找到的每一个脚本样本都有一行,而且只有一行 那么基本上,我该如何处理这个完全有效的脚本呢
"script": {
"script": "doc['state'].value == 'completed' && doc['lastStateUpdate'].value < doc['dueDate'].value"
}
“脚本”:{
“脚本”:“doc['state'].value=='completed'和&doc['lastStateUpdate'].value
把它变成像这样的东西
"script": {
"script": "def isCompleted = doc['state'].value == 'completed'
def preSLA = doc['lastStateUpdate'].value < doc['dueDate'].value
return isCompleted && preSLA"
}
“脚本”:{
“脚本”:“def isCompleted=doc['state']。值=='completed'
def preSLA=doc['lastStateUpdate']。值
我对创建一个只写一行代码来表达逻辑的想法不感兴趣,我可以看到更多这样的代码,虽然这一行代码相对简单,但“一行代码”并不能解决这个问题
另一种方法是在索引文档之前对其进行一些预处理,并向其添加额外的数据。但是,这也有缺点,因为它相当不灵活,我们需要重新索引所有数据以更改这些聚合,而我们不希望这样做。您只需要用分号分隔每条语句:
"script": {
"script": "isCompleted = doc['state'].value == 'completed'; preSLA = doc['lastStateUpdate'].value < doc['dueDate'].value; return isCompleted && preSLA;"
}
“脚本”:{
“脚本”:“isCompleted=doc['state']。值=='completed';preSLA=doc['lastStateUpdate']。值
但是,请确保不要在脚本字符串中添加换行符,因为它不是有效的JSON。如果要将脚本拆分为多行,则必须使用
“”“
“查询”:{
“功能评分”:{
“脚本_分数”:{
“脚本”:{
“郎”:“无痛”,
“来源”:”
int-total=0;
对于(int i=0;i更新:对于Elasticsearch的某些版本,
源代码应替换为内联谢谢,如果您删除定义,我会将其标记为正确答案(它们不适用).Thank:)很酷,完成了,谢谢!可能你的脚本语言不是groovy。嗨,我尝试了那个脚本,但不起作用,并返回编译错误。这是我的问题,这只在Kibana
控制台中起作用,你不能在Postman
`"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;
"""
}
}
}
}
}`