1居夹、背景
此篇文檔僅僅是簡單的記錄一下painless
的一些簡單的例子疙描,防止以后忘記嗡贺,不過多涉及painless
的語法。
2抖拦、準(zhǔn)備數(shù)據(jù)
2.1 mapping
PUT /index_person
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"province": {
"type": "keyword"
}
}
}
}
2.2 插入數(shù)據(jù)
PUT /index_person/_bulk
{"index":{"_id":1}}
{"name":"張三","age":20,"province":"湖北"}
{"index":{"_id":2}}
{"name":"李四","age":25,"province":"北京"}
{"index":{"_id":3}}
{"name":"王五","age":30,"province":"湖南"}
3升酣、例子
3.1 (update)更新文檔 id=1 的文檔,將 age 加 2歲
POST index_person/_update/1
{
"script": {
"lang": "painless",
"source": """
ctx['_source']['age'] += params['incrAge']
""",
"params": {
"incrAge": 2
}
}
}
3.2 (update_by_query)如果 province 是北京的話态罪,就將 age 減少1歲
POST index_person/_update_by_query
{
"query": {
"term": {
"province": {
"value": "北京"
}
}
},
"script": {
"lang": "painless",
"source": """
ctx['_source']['age'] -= params['decrAge']
""",
"params": {
"decrAge": 1
}
}
}
3.3 (ctx.op)如果張三的年齡小于20歲就不處理噩茄,否則就刪除這個(gè)文檔
POST index_person/_update/1
{
"script": {
"lang": "painless",
"source": """
// 這是默認(rèn)值,表示的是更新值复颈,重新索引記錄
ctx.op = 'index';
if(ctx._source.age < 20){
// 表示不處理
ctx.op = 'none';
}else{
// 表示刪除這個(gè)文檔
ctx.op = 'delete';
}
"""
}
}
3.4 (stored script)如果是湖南省則增加地市字段绩聘,值為長沙
3.4.1 創(chuàng)建存儲(chǔ)腳本
PUT _scripts/add_city
{
"script":{
"lang": "painless",
"source": "ctx._source.city = params.city"
}
}
add_city
為腳本的id
3.4.2 使用存儲(chǔ)腳本
POST index_person/_update_by_query
{
"query": {
"term": {
"province": {
"value": "湖南"
}
}
},
"script": {
"id": "add_city",
"params": {
"city": "長沙"
}
}
}
3.5 (pipeline)通過pipeline如果插入的文檔的age<10則放入到index_person_small索引中
3.5.1 創(chuàng)建pipeline
PUT _ingest/pipeline/pipeline_index_person_small
{
"description": "如果插入的文檔的age<10則放入到index_person_small索引中",
"processors": [
{
"script": {
"source": """
if(ctx.age < 10){
ctx._index = 'index_person_small';
}
"""
}
}
]
}
3.5.2 使用pipeline
PUT index_person/_doc/4?pipeline=pipeline_index_person_small
{
"name":"趙六",
"age": 8,
"province":"四川"
}
3.5.3 運(yùn)行結(jié)果
3.6 function_score中使用script_score算分
3.6.1 需求
如果這個(gè)用戶是湖南
的,則使用 age
作為分?jǐn)?shù)
3.6.2 dsl
GET index_person/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": """
if(doc.province.value == 0){
return 0;
}
if(doc.province.value == '湖南'){
return doc.age.value;
}
return 0;
"""
}
}
],
"boost_mode": "sum",
"score_mode": "sum"
}
}
}
3.6.3 運(yùn)行結(jié)果
3.7 script_fields 增加字段
GET index_person/_search
{
"query": {"match_all": {}},
"fields": [
"double_age"
],
"script_fields": {
"double_age": {
"script": {
"lang": "painless",
"source": "doc.age.value * 2"
}
}
}
}
3.8 runtime field 增加字段
3.8.1 需求
針對(duì)age<25
的文檔,返回double_age
字段凿菩,否則不處理驯遇。
3.8.2 dsl
GET index_person/_search
{
"query": {
"match_all": {}
},
"fields": [
"double_age"
],
"runtime_mappings": {
"double_age":{
"type": "keyword",
"script": """
if(doc.age.size() == 0){
return;
}
if(doc.age.value < 25){
emit(doc.age.value * 2 + '');
}
"""
}
}
}
在runtime field 中,需要使用emit
來返回?cái)?shù)據(jù)蓄髓,但是不是emit(null)
3.9 _reindex 中使用
3.9.1 dsl
POST _reindex
{
"source": {
"index": "index_person"
},
"dest": {
"index": "index_person_new"
},
"script": {
"lang": "painless",
"source": """
if(ctx._source.age < 25){
ctx._source.tag = '年輕人';
}else{
ctx._source.tag = '中年人';
}
"""
}
}
3.9.2 運(yùn)行結(jié)果
3.10 script query 查詢age<25
GET index_person/_search
{
"query": {
"script": {
"script": {
"lang": "painless",
"source": """
if(doc.age.size() == 0){
return false;
}
return doc.age.value < 25;
"""
}
}
}
}
3.11 script 聚合
GET index_person/_search
{
"size": 0,
"aggs": {
"agg_province": {
"terms": {
"script": {
"lang": "painless",
"source": """
return doc.province
"""
},
"size": 10
}
},
"agg_age":{
"avg": {
"script": "params._source.age"
}
}
}
}
4叉庐、painless腳本調(diào)試
可以通過
Debug.explain
來進(jìn)行一些簡單的調(diào)試。
5会喝、腳本中的doc[..]和params._source[..]
doc[..]:使用doc關(guān)鍵字陡叠,將導(dǎo)致該字段的術(shù)語被加載到內(nèi)存(緩存),這將導(dǎo)致更快的執(zhí)行肢执,但更多的內(nèi)存消耗枉阵。此外,doc[…]表示法只允許簡單的值字段(您不能從中返回json對(duì)象)预茄,并且僅對(duì)非分析或基于單個(gè)術(shù)語的字段有意義兴溜。然而,如果可能的話耻陕,使用doc仍然是訪問文檔值的推薦方法拙徽。
params[_source][..]: 每次使用_source都必須加載和解析, 因此使用_source會(huì)相對(duì)而言要慢點(diǎn)。
6诗宣、painless腳本中的上下文
詳細(xì)了解膘怕,請(qǐng)參考這個(gè)文檔https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-contexts.html