SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
文章目录
- SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
- @[TOC]
- 前言
- 一、Elasticsearch的script语法介绍
- 二、Elasticsearc中数据准备
- 三、script实现案例
- 1.批量新增es中List<Integet>类型数据
- 2.批量删除es中List<Integet>类型数据
- 总结
文章目录
- SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
- @[TOC]
- 前言
- 一、Elasticsearch的script语法介绍
- 二、Elasticsearc中数据准备
- 三、script实现案例
- 1.批量新增es中List<Integet>类型数据
- 2.批量删除es中List<Integet>类型数据
- 总结
章节
第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现)
第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询)
第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询)
第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查询)
第五章链接: SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)
第六章链接: SpringBoot集成Elasticsearch8.x(6)|(新版本Java API Client使用)
第七章链接: SpringBoot集成Elasticsearch8.x(7)|(新版本Java API Client使用完整示例)
前言
Painless Scripting 简介:
Painless是一种简单,安全的脚本语言,专为与Elasticsearch一起使用而设计。从ES5.0开始,它是Elasticsearch的默认脚本语言,可以安全地用于内联和存储脚本。
Painless特点:
性能牛逼:Painless脚本运行速度比备选方案(包括Groovy)快几倍。
安全性强:使用白名单来限制函数与字段的访问,避免了可能的安全隐患。
可选输入:变量和参数可以使用显式类型或动态def类型。
上手容易:扩展了java的基本语法,并兼容groove风格的脚本语言特性。
特定优化:是ES官方专为Elasticsearch脚本编写而设计。
使用场景:
用于解决复杂业务问题,如:自定义字段、自定义评分、自定义更新、自定义聚合分析等
缺点:
性能问题。官方文档性能优化中明确指出使用脚本会导致性能低;
如非必要,不要使用脚本,尽量用其他方式替换
一、Elasticsearch的script语法介绍
lang:指定编写脚本的语言。默认为painless.
source:source为脚本本身
params:指定作为变量传递到脚本中的任何命名参数。
"script": {"lang": "","source": "","params": { ... }}
二、Elasticsearc中数据准备
准备一篇文章,存入ES数据库中,versionList是一个list数组,表示该文章的版本号列表,后续的操作会针对版本进行操作
{"_index": "64c36a324bfade24ee0f18ab","_id": "ACNZm4kBoucrmKIhwyQC","_version": 1,"_score": 1,"_source": {"id": "c32e0056a6284ee7b2ea6e483ce874e2","docId": "64c36af14bfade24ee0f18ba","parentId": "64c36af14bfade24ee0f18ba","docName": "Csdn博客介绍.pdf","fileExtension": "pdf","content": "CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区","title": "Csdn博客介绍","sort": 13,"versionList": [1]}
}
三、script实现案例
1.批量新增es中List类型数据
业务需求,需要在原有的某个版本上新建一个新的版本,具体实现如下,找到对应的版本文章,然后对其进行新增操作
public void addVersion(String indexName, Integer fromVersion, Integer newVersion) {Map<String, JsonData> map = Maps.newHashMap();map.put("newVersion", JsonData.of(newVersion));try {client.updateByQuery(d -> d.index(indexName).query(q -> q.term(t -> t.field("libVersionList").value(fromVersion))).script(s -> s.inline(src -> src.lang("painless").source("ctx._source.versionList.add(params.newVersion)").params(map))));} catch (IOException e) {log.error(e.getMessage());}}
2.批量删除es中List类型数据
业务需求,需要删除某个版本,具体实现如下,找到对应的版本文章,然后对其进行移除版本号操作,
注意:此处需要便利versionList,找到对应的下标,.remove()操作是删除对应位置的数据
public void deleteVersion(String indexName, Integer version) {Map<String, JsonData> map = Maps.newHashMap();map.put("version", JsonData.of(version));try {client.updateByQuery(d -> d.index(indexName).query(q -> q.term(t -> t.field("versionList").value(version))).script(s -> s.inline(src -> src.lang("painless").source("for (int i = 0; i < ctx._source.versionList.length; i++){if(params.version == ctx._source.versionList[i]){ctx._source.versionList.remove(i)}}").params(map))));} catch (IOException e) {log.error( e.getMessage());}}
总结
以上就是elasticsearch java client 中使用script对数据镜像批量跟新的操作,语法熟悉了操作起来还是很简单的。