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使用)](#文章目录 SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用) @[TOC] 前言 一、Elasticsearch的script语法介绍 二、Elasticsearc中数据准备 三、script实现案例 1.批量新增es中List<Integet>类型数据 2.批量删除es中List<Integet>类型数据 总结)
  • [@[TOC]](#文章目录 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>类型数据 总结)
  • [一、Elasticsearch的script语法介绍](#文章目录 SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用) @[TOC] 前言 一、Elasticsearch的script语法介绍 二、Elasticsearc中数据准备 三、script实现案例 1.批量新增es中List<Integet>类型数据 2.批量删除es中List<Integet>类型数据 总结)
  • [二、Elasticsearc中数据准备](#文章目录 SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用) @[TOC] 前言 一、Elasticsearch的script语法介绍 二、Elasticsearc中数据准备 三、script实现案例 1.批量新增es中List<Integet>类型数据 2.批量删除es中List<Integet>类型数据 总结)
  • [三、script实现案例](#文章目录 SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用) @[TOC] 前言 一、Elasticsearch的script语法介绍 二、Elasticsearc中数据准备 三、script实现案例 1.批量新增es中List<Integet>类型数据 2.批量删除es中List<Integet>类型数据 总结)
  • [1.批量新增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>类型数据 总结)
  • [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集成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:指定作为变量传递到脚本中的任何命名参数。

c 复制代码
	  "script": {
    "lang":   "",
    "source": "",
    "params": { ... }
  }

二、Elasticsearc中数据准备

准备一篇文章,存入ES数据库中,versionList是一个list数组,表示该文章的版本号列表,后续的操作会针对版本进行操作

json 复制代码
{
	"_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类型数据

业务需求,需要在原有的某个版本上新建一个新的版本,具体实现如下,找到对应的版本文章,然后对其进行新增操作

c 复制代码
    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()操作是删除对应位置的数据

c 复制代码
    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对数据镜像批量跟新的操作,语法熟悉了操作起来还是很简单的。

相关推荐
drebander10 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天24913 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn18 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟19 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy29 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
新知图书30 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
弗锐土豆36 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239136 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext