Painless scripting
Painless scripting 是一種簡單的拟糕、安全的針對ES設(shè)計(jì)的腳本語言胚迫,Painless 可以使用在任何可以使用scripting的場景宠默,腳本提供了以下優(yōu)點(diǎn):
- 更高的性能骆姐,scripting 腳本比其他的可選腳本快數(shù)倍滤钱。
- 安全性高偶器,更小顆粒度的字段授權(quán)機(jī)制斩萌,避免可能不必要的安全隱患安全。
- 可選類型屏轰,變量和參數(shù)可以使用顯示或者動(dòng)態(tài)類型編程方式
- 語法颊郎,擴(kuò)展java的語法并兼容了其他腳本
- 優(yōu)化,專為ES設(shè)計(jì)的腳本語言
常用關(guān)鍵字:
if霎苗、else姆吭、while、do叨粘、for猾编、in,continue升敲,break答倡,return,
new驴党、try瘪撇、catch、throw、this倔既、instanceof
常用舉例
#添加測試數(shù)據(jù)
POST my_goods/_bulk
{"index":{"_id":1}}
{"goodsName":"蘋果 51英寸 4K超高清","skuCode":"skuCode1","brandName":"蘋果","closeUserCode":["0"],"channelType":"cloudPlatform","shopCode":"sc00001","publicPrice":8188.88,"groupPrice":null,"boxPrice":null,"boostValue":1.8}
{"index":{"_id":2}}
{"goodsName":"蘋果 55英寸 3K超高清","skuCode":"skuCode2","brandName":"蘋果","closeUserCode":["0"],"channelType":"cloudPlatform","shopCode":"sc00002","publicPrice":6188.88,"groupPrice":null,"boxPrice":null,"boostValue":1.0}
{"index":{"_id":3}}
{"goodsName":"蘋果UA55RU7520JXXZ 53英寸 4K高清","skuCode":"skuCode3","brandName":"美國蘋果","closeUserCode":["0"],"channelType":"cloudPlatform","shopCode":"sc00001","publicPrice":8388.88,"groupPrice":null,"boxPrice":[{"boxType":"box1","boxUserCode":["htd003","uc004"],"boxPriceDetail":4388.88},{"boxType":"box2","boxUserCode":["uc005","uc0010"],"boxPriceDetail":5388.88}],"boostValue":1.2}
{"index":{"_id":4}}
{"goodsName":"山東蘋果UA55RU7520JXXZ 蘋果54英寸 5K超高清","skuCode":"skuCode4","brandName":"山東蘋果","closeUserCode":["uc001","uc002","uc003"],"channelType":"cloudPlatform","shopCode":"sc00001","publicPrice":8488.88,"groupPrice":[{"level":"level1","boxLevelPrice":"2488.88"},{"level":"level2","boxLevelPrice":"3488.88"}],"boxPrice":[{"boxType":"box1","boxUserCode":["uc004","uc005","uc006","uc001"],"boxPriceDetail":4488.88},{"boxType":"box2","boxUserCode":["htd007","htd008","htd009","uc0010"],"boxPriceDetail":5488.88}],"boostValue":1.2}
添加字段
POST my_goods/_update_by_query
{
"script" : "ctx._source.new_brandName = ctx._source.brandName + '新品'"
}
#查詢結(jié)果
GET my_goods/_search
#返回(省略部分無關(guān)字段)
"hits" : [
{
"_index" : "my_goods",
"_source" : {
"shopCode" : "sc00001",
"new_brandName" : "蘋果新品",
"brandName" : "蘋果",
"closeUserCode" : [
"0"
]
}
},
{
"_index" : "my_goods",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"shopCode" : "sc00002",
"new_brandName" : "蘋果新品",
"brandName" : "蘋果",
"closeUserCode" : [
"0"
],
"groupPrice" : null,
"boxPrice" : null,
"channelType" : "cloudPlatform",
"boostValue" : 1.0,
"publicPrice" : "6188.88",
"goodsName" : "蘋果 55英寸 3K超高清",
"skuCode" : "skuCode2"
}
},
....
]
#可以看到使用腳本新增的字段new_brandName已經(jīng)生效
刪除字段
POST my_goods/_update_by_query
{
"script":"ctx._source.remove('new_brandName')"
}
更改字段值
#將ID為1的商品的價(jià)格提高2倍
POST my_goods/_update/1
{
"script": {
"source": "ctx._source.publicPrice = ctx._source.publicPrice * params.promote_percent",
"lang": "painless",
"params": {
"promote_percent": 2
}
}
}
#查詢
GET my_goods/_doc/1
#返回
{
"_index" : "my_goods",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 4,
"_primary_term" : 1,
"found" : true,
"_source" : {
"goodsName" : "蘋果 51英寸 4K超高清",
"skuCode" : "skuCode1",
"brandName" : "蘋果",
"closeUserCode" : [
"0"
],
"channelType" : "cloudPlatform",
"shopCode" : "sc00001",
"publicPrice" : 16377.76,
"groupPrice" : null,
"boxPrice" : null,
"boostValue" : 1.8
}
}
#可以看到恕曲,在更新前價(jià)格為“8188.88”,通過腳本更新后價(jià)格變?yōu)?6377.76
排序
#修改goodsName可以被doc訪問
PUT my_goods/_mapping
{
"properties": {
"goodsName":{
"type":"text",
"fielddata": "true"
}
}
}
#查詢并排序渤涌,根據(jù)商品名稱長度并添加干擾因子1.1倍為最終排序結(jié)果
POST my_goods/_search
{
"query": {
"match": {
"brandName": "蘋果"
}
},
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "doc['goodsName'].value.length() * params.factor",
"params": {
"factor": 1.1
}
},
"order": "asc"
}
}
}