当前位置: 代码迷 >> 综合 >> Elasticsearch 的Painless
  详细解决方案

Elasticsearch 的Painless

热度:93   发布时间:2023-11-20 09:42:04.0

  在 Elasticsearch 中,它使用了一个叫做 Painless 的语言。它是专门为 Elasticsearch 而建立的。Painless 是一种简单,安全的脚本语言,专为与 Elasticsearch 一起使用而设计。 它是 Elasticsearch 的默认脚本语言,可以安全地用于 inline 和 stored 脚本。它具有像 Groovy 那样的语法。

Painless 语法主要用于复杂的操作,简单es自己本身就有,比如下面的范围查询:


GET twitter/_search
{"query": {"script": {"script": {"inline": "doc['update_time'].value < 1628665440351 && doc['update_time'].value > 1627354454573","lang": "painless"}}}
}

GET twitter/_search
{"query": {"range": {"update_time": {"gt": "1627354454573","lt": "1628665440351"}}}
}

painless 主要的使用方式 为 查询和更新

查询

GET twitter/_search
{"query": {"script": {"script": {"inline": "doc['AvgScrRead'].value < 350 && doc['AvgScrMath'].value > 350","lang": "painless"}}}
}

更新

POST twitter/_update/1
{"script": {"source": "ctx._source.age = 30"}
}# 下为 增加脚本的名称(定义函数)PUT _scripts/add_age  # 创建了一个 id= add_age的函数
{"script": {"lang": "painless","source": "ctx._source.age += params.value" #更新对象 ctx._source.field_name}
}

复杂查询


{"query": {"bool":{"must":{"script":{"script":{"inline":"int total = 0; for (int i = 0; i < doc['gp'].length; ++i) { total += doc['gp'][i]; }  if(total>30) return total;","lang":"painless"},"script":{"inline":"int total = 0; for (int i = 0; i < doc['goals'].length; ++i) { total += doc['goals'][i]; }  if(total>50) return total;","lang":"painless"},"script":{"inline":"if('sean'.equals(doc['first.keyword'].value))   return true;","lang":"painless"}}}}}

painless接下来是关于传递参数

GET twitter/_search
{"query": {"script": {"script": {"source": "doc['city'].contains(params.name)",   # 通过参数的方式params.name"lang": "painless","params": {"name": "北京"}}}}
}{"query": {"script": {"script": {"inline": "doc['AvgScrRead'].value < 350 && doc['AvgScrMath'].value > 350", #通过直接传值"lang": "painless"}}}
}

  相关解决方案