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

相关推荐
得物技术4 分钟前
Java volatile 关键字到底是什么|得物技术
java·后端
青梅主码4 分钟前
【手把手攻略】国家育儿补贴正式开领!一键算清你能拿多少钱?附补贴领取计算器
后端
HoHeHa7 分钟前
IDEA 手动下载安装数据库驱动,IDEA无法下载数据库驱动问题解决方案,IDEA无法连接数据库解决方案(通用,Oracle为例)
java·数据库·intellij-idea
用户6083089290478 分钟前
Spring Boot自定义注解
spring boot
你可以叫我仔哥呀12 分钟前
Java程序员学从0学AI(七)
java·开发语言·人工智能·ai·spring ai
阿宙ppppp17 分钟前
yoloV5的环境安装
后端·图像识别
杨DaB30 分钟前
【SpringMVC】MVC中Controller的配置 、RestFul的使用、页面重定向和转发
java·笔记·后端·学习·spring·mvc·restful
linyb极客之路34 分钟前
干货来袭!5 分钟学会快速实现责任链,效率直接拉满!
java
创码小奇客38 分钟前
保姆级 Talos 超参数优化实战指南:从入门到封神
java·后端·架构
程序媛李李李李李蕾44 分钟前
你不能直接用现成的吗?整个前端做笔记管理工具真是折腾人
javascript·vue.js·后端