Elasticsearch Painless scripting

2021-05-05  本文已影响0人  月伴沧海

Painless scripting

Painless scripting 是一种简单的、安全的针对ES设计的脚本语言,Painless 可以使用在任何可以使用scripting的场景,脚本提供了以下优点:

常用关键字:

if、else、while、do、for、in,continue,break,return,
new、try、catch、throw、this、instanceof

常用举例

#添加测试数据
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 + '新品'"
}
#查询结果
GET my_goods/_search
#返回(省略部分无关字段)

"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已经生效

删除字段

POST my_goods/_update_by_query
{
  "script":"ctx._source.remove('new_brandName')"
}

更改字段值

#将ID为1的商品的价格提高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
  }
}
#可以看到,在更新前价格为“8188.88”,通过脚本更新后价格变为16377.76

排序

#修改goodsName可以被doc访问
PUT my_goods/_mapping
{
  "properties": {
    "goodsName":{
      "type":"text", 
      "fielddata": "true"
    }
  }
}
#查询并排序,根据商品名称长度并添加干扰因子1.1倍为最终排序结果
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"
    }
  }
}
上一篇下一篇

猜你喜欢

热点阅读