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

相关推荐
风象南几秒前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
前端付豪23 分钟前
17、自动化才是正义:用 Python 接管你的日常琐事
后端·python
我是一只代码狗27 分钟前
springboot中使用线程池
java·spring boot·后端
hello早上好40 分钟前
JDK 代理原理
java·spring boot·spring
PanZonghui42 分钟前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
PanZonghui44 分钟前
Centos项目部署之运行SpringBoot打包后的jar文件
linux·spring boot
PanZonghui44 分钟前
Centos项目部署之Java安装与配置
java·linux
Victor3561 小时前
MySQL(119)如何加密存储敏感数据?
后端
用户3966144687191 小时前
TypeScript 系统入门到项目实战-慕课网
后端