elasticsearch之Painless脚本应用

#########Demo for Painless###############

Painless 简介
● ⾃ Elasticsearch 5.x 后引⼊,专⻔为 Elasticsearch 设计,扩展了 Java 的语法。 ● 6.0 开始,ES 只⽀持 Painless。Groovy, JavaScript 和 Python 都不再⽀持
● Painless ⽀持所有 Java 的数据类型及 Java API ⼦集
● Painless Script 具备以下特性
○ ⾼性能 / 安全
○ ⽀持显示类型或者动态定义类型
Painless 的⽤途
● 可以对⽂档字段进⾏加⼯处理
● 更新或删除字段,处理数据聚合操作
● Script Field:对返回的字段提前进⾏计算
● Function Score:对⽂档的算分进⾏处理
● 在 Ingest Pipeline 中执⾏脚本
● 在 Reindex API,Update By Query 时,对数据进⾏处理

通过 Painless 脚本访问字段

上下⽂ :语法

Ingestion : ctx.field_name

Update :ctx._source.field_name

Search & Aggregation :doc[“field_name”]

案例1,script processor

通过simulate指定我们进行pipeline模拟测试,我们可以将painless 脚本当成processors中的一个环节,对我们的文档数据进行处理 在spirce:""" … “”"中书写我们的脚本
下面的第二个环节则是指定。如果我们的数据的key中包含content 则计算他的长度,否则,他的长度为0
POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "to s[lit blog tags",
    "processors": [
      {
        "split": {
          "field": "tags",
          "separator": ","
        }
      },
      {
        "script": {
          "source": """
          if(ctx.containsKey("content")){
            ctx.content_length= ctx.content.length();
          }else{
            ctx.content_length=0;
          }
"""
        }
      },
      {
        "set": {
          "field": "views",
          "value": 0
        }
      }
    ]
  },
  "docs": [
    {
      "_index": "index",
      "_id": "id",
      "_source": {
        "title": "Introducing big data......",
        "tags": "hadoop,elasticsearch,spark",
        "content": "You konw, for big data"
      }
    },
    {
      "_index": "index",
      "_id": "idxx",
      "_source": {
        "title": "Introducing cloud computering",
        "tags": "openstack,k8s",
        "content": "You konw, for cloud"
      }
    }
  ]
}

DELETE tech_blogs
PUT tech_blogs/_doc/1
{
  "title":"Introducing big data......",
  "tags":"hadoop,elasticsearch,spark",
  "content":"You konw, for big data",
  "views":0
}

POST tech_blogs/_update/1
{
  "script": {
    "source": "ctx._source.views += params.new_views",
    "params": {
      "new_views": 100
    }
  }
}

查看views计数

发现数据已经修改

POST tech_blogs/_search 

我们可以把脚本保存在es的 cluster state中

POST _scripts/update_views
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.views += params.new_views"
  }
}

通过脚本修改数据

指定脚本id

POST tech_blogs/_update/1
{
  "script": {
    "id": "update_views",
    "params": {
      "new_views": 1000
    }
  }
}

GET tech_blogs/_doc/1

搜索时 指定脚本,操作数据

GET tech_blogs/_search
{
  "script_fields": {
    "random_fields": {
      "script": {
        "lang": "painless",
        "source": """
        java.util.Random rnd = new Random();
        doc['views'].value + rnd.nextInt(1000);
"""
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

注意: script: lnline vs Stored

在线模式Inline脚本

POST tech_blogs/_update/1
{
  "script": {
    "source": "ctx._source.views += params.new_views",
    "params": {
      "new_views": 100
    }
  }
}
### 将脚本保存在cluster state中
POST _scripts/update_views
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.views += params.new_views"
  }
}
### 通过id使用 使用params 减少编译的条数
POST tech_blogs/_update/1
{
  "script": {
    "id": "update_views",
    "params": {
      "new_views": 1000
    }
  }
}

脚本缓存

###● 编译的开销相较⼤
###● Elasticsearch 会将脚本编译后缓存在Cache 中
###● Inline scripts 和 Stored Scripts 都会被缓存
###● 默认缓存 100 个脚本

script.cache.max_size 设置最⼤缓存数

script.cache.expire 设置缓存超时

script.max_compilations_rate 默认5分钟最多75

次编译 (75/5m)

你可能感兴趣的:(elasticsearch,技术使用总结,知识总结,elasticsearch)