spring-boot操作elasticsearch

一、环境准备

springboot与elasticsearch的更新都非常快,为了避免兼容性问题,要注意下选择的版本问题。具体的可参考官网 -->  springboot与elasticsearch版本兼容性

1.1导入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.7.18</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency>
</dependencies>

1.2application.properties文件配置

spring.elasticsearch.rest.uris=http://localhost:9200
spring.elasticsearch.rest.username=dev
spring.elasticsearch.rest.password=123456

1.3创建实体对象

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;@Document(indexName = "employee")
@Data
public class Employee {@Idprivate int id;@Field(name = "name")private String name;@Field(name = "addr", type = FieldType.Keyword)private String addr;}

该实体类加上@Document注解之后,程序启动后就会自动向ED发送创建索引的请求(若没有则创建)。

1.4创建Repository接口

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface EmployeeRepository extends ElasticsearchRepository<Employee, Integer> {
}

1.5Crud测试案例

使用该接口可方便对索引进行增删查改。例子比较简单,我们直接写个单元测试。代码如下:

import gamecontext.admin.elasticsearch.Employee;
import gamecontext.admin.elasticsearch.EmployeeRepository;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest()
@RunWith(SpringRunner.class)
public class ElasticsearchTest {@Autowiredprivate EmployeeRepository repository;@Testpublic void testSave() {Employee p = new Employee();p.setId(3);p.setAddr("北京");p.setName("Tim");repository.save(p);Assert.assertEquals("Tim", repository.findById(3).get().getName());}@Testpublic void testDelete() {Employee p = new Employee();p.setId(4);p.setAddr("北京");p.setName("Tim");repository.save(p);repository.deleteById(4);Assert.assertFalse(repository.findById(4).isPresent());}@Testpublic void testUpdate() {Employee p = repository.findById(3).get();p.setName("南京");repository.save(p);Assert.assertEquals(repository.findById(3).get().getName(), "南京");}}

二、使用QueryBuilder进行文档的复杂查询

ElasticsearchRepository只能对文档进行简单的增删查改,如果遇到复杂的全文搜索,则需要借助QueryBuilder和ElasticsearchRestTemplate相关API

2.1数据准备

往索引插入3条文档,数据如下

2.2进行must查询 

import gamecontext.admin.elasticsearch.Employee;
import gamecontext.admin.elasticsearch.EmployeeRepository;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest()
@RunWith(SpringRunner.class)
public class ElasticsearchTest2 {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testpublic void testMust() {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "李")).must(QueryBuilders.matchQuery("name", "四"));nativeSearchQueryBuilder.withQuery(boolQueryBuilder);SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);Assert.assertTrue(hits.stream().findFirst().isPresent());Assert.assertEquals(hits.stream().findFirst().get().getContent().getName(), "李四");}
}

等效的Kibana命令

2.3进行range查询 

    @Testpublic void testRange() {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();RangeQueryBuilder builder = QueryBuilders.rangeQuery("age").lte(20).gte(10);nativeSearchQueryBuilder.withQuery(builder);SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);Assert.assertEquals(2, hits.getTotalHits());}

等效的Kibana命令

2.4进行sort排序

    @Testpublic void testSort() {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
//                .withSort(SortBuilders.fieldSort("name").order(SortOrder.ASC));SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);Employee p1 = hits.stream().findFirst().get().getContent();List<SearchHit<Employee>> list = hits.stream().collect(Collectors.toUnmodifiableList());Assert.assertTrue(list.get(0).getContent().getAge()>list.get(1).getContent().getAge());Assert.assertTrue(list.get(1).getContent().getAge()>list.get(2).getContent().getAge());}

 等效的Kibana命令

默认情况下,text类型的字段是不能排序的,否则会报以下异常,

Caused by: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]]

翻译如下:

默认情况下,文本字段禁用字段数据。在[region]上设置fielddata=true,以便通过取消反转索引将fielddata加载到内存中。请注意,这可能会占用大量内存。

解决方法:

  • 将name字段设置为keyword类型
  • 将name字段的fielddata()为true

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习基础知识之通道数channels

大多数的深度学习模型&#xff0c;模型上会展示图片的尺寸&#xff0c;如&#xff1a;352x352x3 这里面352x352表示的是像素大小&#xff0c;即高和宽都为352个像素&#xff0c;而3表示的是通道数&#xff0c;指输入的是3通道的RGB图像&#xff0c;每个颜色通道的取值范围为0-2…

中间件面试题之ElasticSearch

ElasticSearch相关面试题 此题是xx位面试题 (1)有两个机房,每个机房两台服务器,总共有4台服务器搭建的ES集群,怎么控制所有副本在一个机房或者某些节点里面。 可以通过打标签的形式,指定哪些索引的主分片在哪个节点上。 首先指定节点的类型: ## 指定节点类型 方式 …

在Ubuntu中如何基于conda安装jupyterlab

在Ubuntu中如何创建ipykernel 可以用下面命令完成 conda create -n newenv python3.8conda activate enwenvconda install ipykernel5.1.4conda install ipython_genutilsipython -m ipykernel install --user --namepython3 --display-name Python3conda install -c conda-fo…

k8s的pod和svc相互访问时网络链路解析

k8s的pod和svc相互访问时网络链路解析 1. k8s环境中pod相互访问1.1. k8s中pod相互访问的整体流程1.2. k8s的相同机器的不同pod相互访问1.3. k8s的不同机器的不同pod相互访问 3. k8s访问svc3.1 nat操作3.2 流量进入到后端pod 4. 疑问和思考4.1 访问pod相互访问为什么不用做nat?…

使用go开发的小tips

开启go modGOROOT是你下载的go编译器的目录。GOPATH的位置是Go开发的工作空间&#xff0c;比如可用于保存Go项目的代码和第三方依赖包。下载不了包多半是镜像源有问题&#xff0c;什么阿里七牛都试下go mod tidy可以拉取未下载的包&#xff0c;移除没用上的包进行web开发时热重…

服务器简单介绍

服务器简单介绍 从软件研究到了硬件&#xff08;伤心&#xff09;&#xff0c;需要学习的太多了。硬件从来不是我的爱好范畴&#xff0c;奈何最近的项目需要考虑和提出的方案需要考虑的挺多&#xff0c;一点点啃吧&#xff01;日记式逐步记下&#xff1a; 服务器分类 按计算器…

保研复习数据结构记(9)--基数排序

基数排序的过程&#xff1f;首先设置r个&#xff08;r&#xff1a;每个关键字位可以对应多少取值&#xff09;空队列&#xff0c;&#xff0c;按照各个关键字位权重递增的次序&#xff08;个、十、百&#xff09;&#xff0c;将d个元素&#xff08;关键字可以被拆分成d个部分&a…

YoloV8实战:YoloV8-World应用实战案例

摘要 YOLO-World模型确实是一个突破性的创新,它结合了YOLOv8框架的实时性能与开放式词汇检测的能力,为众多视觉应用提供了前所未有的解决方案。以下是对YOLO-World模型的进一步解读: 模型架构与功能 YOLO-World模型充分利用了YOLOv8框架的先进特性,并引入了开放式词汇检…

uView Collapse 折叠面板

通过折叠面板收纳内容区域 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 <template><u-collapsechange"change"close"close"open"open"><u-collapse-itemtitle&…

使用node.js 开发后端的优缺点

node做后端的缺点是&#xff1a; 1.nodejs单线程&#xff0c;不能做cpu密集型操作&#xff0c;导致时间片不能释放&#xff0c;阻塞后面的任务。 2.nodejs可靠性比较低&#xff0c;一个地方报错会导致整个程序崩溃&#xff0c;需要守护进程或者docker重启来解决。 3.像使用多…

金枪鱼群优化算法TSO优化BiLSTM-ATTENTION实现风力发电功率预测(matlab)

金枪鱼群优化算法TSO优化BiLSTM-ATTENTION实现风力发电功率预测&#xff08;matlab&#xff09; TSO-BiLSTM-Attention金枪鱼群算法优化长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 金枪鱼群优化算法&#xff08;Tuna Swarm Optimization&#xff0c;TSO)是一…

生成式人工智能服务安全基本要求实务解析

本文尝试明晰《基本要求》的出台背景与实践定位&#xff0c;梳理《基本要求》所涉的各类安全要求&#xff0c;以便为相关企业遵循执行《基本要求》提供抓手。 引言 自2022年初以来&#xff0c;我国陆续发布算法推荐、深度合成与生成式人工智能服务相关的规范文件&#xff0c;…

丘一丘正则表达式

正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符说明实…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)

搜索框组件&#xff0c;适用于浏览器的搜索内容输入框等应用场景。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Search(options?: { value?: string, placeholder?: Reso…

webpack5高级--02_提升打包构建速度

提升打包构建速度 一、HotModuleReplacement 为什么 开发时我们修改了其中一个模块代码&#xff0c;Webpack 默认会将所有模块全部重新打包编译&#xff0c;速度很慢。 所以我们需要做到修改某个模块代码&#xff0c;就只有这个模块代码需要重新打包编译&#xff0c;其他模…

混合云构建-VPN打通阿里云和Azure云

要在阿里云和Azure云之间通过VPN打通网络,您需要在两边分别设置VPN网关,并配置相应的连接和路由规则以确保两个云环境之间的网络流量可以互通。以下是一个基本的步骤指南: 为了更具体地说明如何在阿里云和Azure之间通过VPN打通网络,我们将通过一个简化的示例来演示整个过程…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28&#xff08;最新版&#xff09;SDK离线部署 测试资源4.18 以及之前版本4.19 以及之后版本 接触一段时间 ArcGIS JSAPI 之后&#xff0c;整体感觉还好&#xff0c;后来需要解决不同版本问题&#xff0…

redis中通用命令以及key过期策略

通用命令 exists 判断某个key是否存在。 exists key时间复杂度&#xff1a;O(1) 返回值&#xff1a;key 存在的个数。 del 删除指定的 key&#xff0c;可以一次删除一个或者多个。 del key时间复杂度&#xff1a;O(1) 返回值&#xff1a;删除掉的 key 的个数。 expire…

数据结构·复杂度

目录 1 时间复杂度 2 大O渐进表示法 举例子&#xff08;计算时间复杂度为多少&#xff09; 3 空间复杂度 前言&#xff1a;复杂度分为时间复杂度和空间复杂度&#xff0c;两者是不同维度的&#xff0c;所以比较不会放在一起比较&#xff0c;但是时间复杂度和空间复杂度是用…

汉服|高校汉服租赁网站|基于Springboot的高校汉服租赁网站设计与实现(源码+数据库+文档)

高校汉服租赁网站目录 目录 基于Springboot的高校汉服租赁网站设计与实现 一、前言 二、系统设计 三、系统功能设计 1、汉服信息管理 2、汉服租赁管理 3、公告管理 4、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…