在 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"
}
}
}
}