跳到主要内容

ES脚本查询

脚本的CRUD

// 使用painless脚本向tags添加元素
POST product/_update/6vO5n5UBPBZCwrPtlmeQ
{
"script": {
"lang": "painless", // 可以省略
"source": "ctx._source.tags.add('60Hz')"
}
}

// 删除数据
POST product/_update/6vO5n5UBPBZCwrPtlmeQ
{
"script": {
"source": "ctx.op='delete'"
}
}

// upsert示例
POST product/_update/6vO5n5UBPBZCwrPtlmeQ
{
"script": {
"source": "ctx._source.price -= 100"
},
"upsert": {
"name": "iPhone 15",
"desc": "苹果公司推出的新一代智能手机,搭载A16芯片,性能流畅,系统稳定,拍照效果出色。",
"price": 6999,
"lv": "中高端",
"type": "手机",
"create_time": "2024-09-15",
"tags": [
"苹果",
"中高端手机",
"性能稳定"
]
}
}

// 查询时对数据进行计算
GET product/_search
{
"script_fields": {
"discount_price": {
"script": {
"source": "doc['price'].value * 0.9"
}
}
}
}

参数化脚本

// 使用参数
POST product/_update/6vO5n5UBPBZCwrPtlmeQ
{
"script": {
"source": "ctx._source.tags.add(params.tag_name)",
"params": {
"tag_name": "60Hz"
}
}
}

// 多参数输出
GET product/_search
{
"script_fields": {
"discount_price": {
"script": {
"source": """[
doc['price'].value * params.discount1,
doc['price'].value * params.discount2,
doc['price'].value * params.discount3
]
""",
"params": {
"discount1": 0.9,
"discount2": 0.7,
"discount3": 0.5
}
}
}
}
}

脚本模板

// 创建脚本
POST _scripts/calculate_discount
{
"script": {
"lang": "painless",
"source": "doc.price.value * params.discount"
}
}

// 查看脚本
GET _scripts/calculate_discount

// 使用脚本
GET product/_search
{
"script_fields": {
"discount_price": {
"script": {
"id": "calculate_discount",
"params": {
"discount": 0.6
}
}
}
}
}

函数式编程

使用""" 可以包含多行代码,适用于复杂的业务逻辑。脚本支持正则表达式、控制语句等。

POST product/_update/6vO5n5UBPBZCwrPtlmeQ
{
"script": {
"source": """
if (ctx._source.name ==~ /.*iPhone.*/) {
ctx._source.tags.add('iPhone手机');
} else {
ctx.op = 'noop';
}
"""
}
}

noop 表示空操作。