Elasticsearch Painless Script详解
文章目录
- 1. Painless 简介
- Painless 的用途
- 2. 参数
- 3. 首选参数
- 4. 简短脚本形式
- 5. 通过 Painless 脚本访问字段
- 6. 示例
- 6.1 案例 1:Script Processsor
- 6.2 案例 2:文档更新计数
- 6.3 案例 3:搜索时的 Script 字段
- 6.4 Script :Inline v.s Stored
- 6.5 示例4
- 3. 缓存
1. Painless 简介
自 ES 5.x 后引入,专门为 ES 设置,扩展了 Java 的语法
6.0 开始,ES 只支持 Painless。Grooby ,JavaScript 和 Python 都不在支持
Painless 支持所有的 Java 的数据类型及 Java API 子集
Painless Script 具备以下特性
- 高性能 、 安全
- 支持显示类型或者动态定义类型
Painless 的用途
Painless 可以对文档字段进行加工处理
- 更新或者删除字段,处理数据聚合操作
- Script Field: 对返回的字段提前进行计算
- Function Score:对文档的算分进行处理
在 Ingest Pipeline 中执行脚本
在 Reindex API,Update By Query 时,对数据进行处理
- 脚本编写的语言,默认为painless。
- 脚本本身可以指定为内联脚本的source或存储脚本的id。
- 应传递给脚本的任何命名参数。
2. 参数
lang
- 指定编写脚本的语言,默认为painless。
source,id
- 指定脚本的来源,inline脚本是指定source,,存储的脚本是指定的id,并从群集状态中检索(请参阅存储的脚本)。
params
- 指定作为变量传递到脚本的任何命名参数。
3. 首选参数
Elasticsearch第一次看到一个新脚本,它会编译它并将编译后的版本存储在缓存中,编译可能是一个繁重的过程。
如果需要将变量传递给脚本,则应将它们作为命名参数传递给脚本本身而不是硬编码值,例如,如果你希望能够将字段值乘以不同的乘数,请不要将乘数硬编码到脚本中:
"source": "doc['my_field'] * 2"
相反,将其作为命名参数传递:
"source": "doc['my_field'] * multiplier","params": {"multiplier": 2}
第一个版本每次乘数改变时都必须重新编译,第二个版本只编译一次。
如果你在很短的时间内编译了太多独特的脚本,Elasticsearch将使用circuit_breaking_exception错误拒绝新的动态脚本。默认情况下,每分钟将编译最多15个内联脚本,你可以通过设置script.max_compilations_rate动态更改此设置。
4. 简短脚本形式
可以使用简短脚本形式来简化,在简短形式中,script由字符串而不是对象表示,该字符串包含脚本的源。
简写:
"script": "ctx._source.likes++"
正常形式的相同脚本:
"script": {"source": "ctx._source.likes++"}
5. 通过 Painless 脚本访问字段
上下文 | 语法 |
---|---|
Ingestion | ctx.field_name |
Update | ctx._source.field_name |
Search & Aggregation | doc[“field_name”] |
6. 示例
6.1 案例 1:Script Processsor
# 增加一个 Script Prcessor
POST _ingest/pipeline/_simulate
{"pipeline": {"description": "to split 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"}}]
}
6.2 案例 2:文档更新计数
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
6.3 案例 3:搜索时的 Script 字段
GET tech_blogs/_search
{"script_fields": {"rnd_views": {"script": {"lang": "painless","source": """java.util.Random rnd = new Random();doc['views'].value+rnd.nextInt(1000);"""}}},"query": {"match_all": {}}
}
6.4 Script :Inline v.s Stored
#保存脚本在 Cluster State
POST _scripts/update_views
{"script":{"lang": "painless","source": "ctx._source.views += params.new_views"}
}POST tech_blogs/_update/1
{"script": {"id": "update_views","params": {"new_views":1000}}
}
6.5 示例4
首先,在集群状态下创建名为calculate-score的脚本:
POST _scripts/calculate-score
{"script": {"lang": "painless","source": "Math.log(_score * 2) + params.my_modifier"}
}
可以使用以下命令检索相同的脚本:
GET _scripts/calculate-score
可以通过指定id参数来使用存储的脚本,如下所示:
GET _search
{"query": {"script": {"script": {"id": "calculate-score","params": {"my_modifier": 2}}}}
}
删除:
DELETE _scripts/calculate-score
3. 缓存
编译的开销相较大
Elasticsearch 会将脚本编译后缓存在 Cache 中
- Inline scripts 和 Stored Scripts 都会被缓存
- 默认缓存 100 个脚本
Elasticsearch Painless Script详解相关推荐
- php操作ElasticSearch搜索引擎流程详解
更多python.php教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpy ...
- Elasticsearch之Template详解
Elasticsearch之Template详解 一.Index Template 示例1 示例2 示例3 二.Dynamic Template 示例1 在ES中我们可以通过设置 Index Temp ...
- Elasticsearch的原理详解和使用
目录 一.Elasticsearch 介绍 1.1 简介 1.2 原理和应用 1.2.1 先了解一下Lucene的整体框架 1.2.2 ES核心概念 1.2.3 ES实现写入和读取的原理 二.Elas ...
- elasticsearch Routing 路由详解
前言 当索引一个文档的时候,文档会被存储到一个主分片中.那么,elasticsearch如何知道一个文档应该存放到哪个分片中呢? 首先这肯定不是随机的,否则在检索文档时就不知道该从哪去寻找它了.实际上 ...
- Elasticsearch 分词器详解(热更新词库)
1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...
- Elasticsearch之配置详解
Cluster 集群名称,默认为elasticsearch: cluster.name: elasticsearch 设置一个节点的并发数量,有两种情况,一种是在初始复苏过程中: cluster. ...
- gradle中的build script详解
文章目录 简介 project和task 一个例子 task详细讲解 task脚本 task依赖 动态task 默认task build script的外部依赖 简介 build.gradle是gra ...
- Elasticsearch聚合深入详解——对比Mysql实现
聚合认知前提 桶(Buckets)--满足特定条件的文档的集合 指标(Metrics)--对桶内的文档进行统计计算 SELECT COUNT(color) FROM table GROUP BY ...
- Elasticsearch检索分类详解
Elasticsearch中当我们设置Mapping(分词器.字段类型)完毕后,就可以按照设定的方式导入数据. 有了数据后,我们就需要对数据进行检索操作.根据实际开发需要,往往我们需要支持包含但不限于 ...
最新文章
- 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键
- Android 重新编译资源文件
- opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)
- pmp每日三题(2022年2月23日)
- 腾讯云大数据套件Hermes-MR索引插件使用总结
- SAP Cloud for Customer interaction center 呼叫中心集成
- container 的背后
- IDEA项目搭建四——使用Mybatis实现Dao层
- 2018年4月工业用微型计算机,2018年自考工业用微型计算机押密试题及答案(六)...
- python任务调度系统web_监听调度系统定时执行任务python_websock
- Hadoop实战(3)_虚拟机搭建CDH的全分布模式
- 作为前端Web开发者,这12条基本命令不可不会
- 保存最大的前20项暴力--Heritage of skywalkert
- Nexus3 功能介绍
- 详解拉东(Radon)变换原理、直线检测、代码实现
- Typora给插图加入图注
- Androidg 改变CheckBox下的选中与未选中图片
- 初识人工智能AI(基本概念)
- java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...
- MY-I.MX6-DEMO Android4.4.2环境搭建
热门文章
- javascript 校验 非空_Javascript的表单与验证-非空验证
- 查看地区的ip段_「教程」CloudFlare 自选 IP优化网站速度
- python的特点及应用-python有什么特性和劣势?老男孩python入门
- 程序发出的广播其他程序收不到_RabbitMQ 如何实现对同一个应用的多个节点进行广播...
- python定时任务apschedule_APScheduler(python 定时任务框架)最简单使用教程
- 基础学习——C语言递归解决分鱼问题
- php链接本地mysql数据库配置文件_php连接 mysql 数据库如何添加一个公共的配置文件...
- oracle flashback 深入研究,oracle 之flashback 深入研究。
- babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发
- linux 配置trac界面显示为中文,安装back|track 5 r3并配置中文界面简单教程