SpringBoot集成ES(ElasticSearch)

1.导入依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

导入依赖后,注意在依赖中查看对应的版本是否与本机ES对应

2.创建配置并编写测试类

@Configuration
public class ElasticSearchConfig {// 注册 rest高级客户端@Beanpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));return client;}
}

测试类测试各种常用API:

@SpringBootTest(classes = ElasticSearchApp.class)
@RunWith(SpringRunner.class)
public class ElasticSearchTest {@Autowiredprivate RestHighLevelClient restHighLevelClient;// 测试索引的创建, Request PUT liuyou_index@Testpublic void createIndex() throws IOException {//创建索引请求CreateIndexRequest request=new CreateIndexRequest("create");//客户端执行请求  请求后获得响应CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);//获取索引GetIndexRequest getIndexRequest=new GetIndexRequest("create");//查看索引是否存在boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);System.out.println(exists);//删除索引DeleteIndexRequest deleteIndexRequest=new DeleteIndexRequest();AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}//删除索引@Testpublic void DeleteIndex() throws IOException {DeleteIndexRequest deleteIndexRequest=new DeleteIndexRequest("create");AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}//添加文档@Testpublic void addDocument() throws IOException {//创建对象Manager manager=new Manager(1,"王五","123");IndexRequest indexRequest=new IndexRequest("test2");//规则  PUT  /test2/_doc/1indexRequest.id("1");indexRequest.timeout(TimeValue.timeValueSeconds(1));//将数据类型放入请求                         JSON格式indexRequest.source(JSON.toJSONString(manager), XContentType.JSON);//客户端发送请求 获取响应结果IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);System.out.println(indexResponse.toString());System.out.println(indexResponse.status());  //对应我们命令返回的状态结果}//判断文档是否存在@Testpublic void testGetDocumentExists() throws IOException {//获取文档 判断是否存在GetRequest getRequest=new GetRequest("test2","1");//不获取_source的上下文了getRequest.fetchSourceContext(new FetchSourceContext(false));getRequest.storedFields("_none_");boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);System.out.println(exists);/*-----------------------------------*///获取文档信息}//获取文档的信息@Testpublic void testGetDocument() throws IOException {//获取文档 判断是否存在GetRequest getRequest=new GetRequest("test2","1");//不获取_source的上下文了GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);System.out.println(documentFields.getSourceAsString());//打印文档内容System.out.println(documentFields); //返回的是全部内容 和命令一样}//更新文档@Testpublic void updateDocument() throws IOException {//获取文档 判断是否存在UpdateRequest updateRequest=new UpdateRequest("test2","1");Manager manager=new Manager(1,"老六","666");//将JSON格式的对象添加updateRequest.doc(JSON.toJSONString(manager),XContentType.JSON);UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);System.out.println(update.status());restHighLevelClient.close();}//删除文档@Testpublic void DeleteDocument() throws IOException {DeleteRequest deleteRequest=new DeleteRequest("test2","1");deleteRequest.timeout("1s");DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(delete.status());restHighLevelClient.close();}//批量插入数据  真实环境一般都是批量插入@Testpublic void BulkDocument() throws IOException {BulkRequest bulkRequest=new BulkRequest();bulkRequest.timeout("10s");   //数据越大最好设置越大ArrayList<Manager> list=new ArrayList<>();list.add(new Manager(2,"哈哈结","886"));list.add(new Manager(2,"特朗噗","856"));list.add(new Manager(2,"王某某","999"));//批处理请求for (int i = 0; i < list.size(); i++) {bulkRequest.add(new IndexRequest("test2").id(""+(i+1)).source(JSON.toJSONString(list.get(i)),XContentType.JSON));}BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulk.hasFailures()); //是否失败  返回false 代表成功}// 查询// SearchRequest 搜索请求//  SearchSourceBuilder 条件构造// HighLightBuilder  构建高亮// TermQueryBuilder 精确查询////搜索@Testpublic void testSearch() throws IOException {SearchRequest searchRequest=new SearchRequest("test2");//构建搜索条件SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();searchSourceBuilder.highlighter(); //高亮//查询条件,可以使用QueryBuilders工具来实现//QueryBuilders.termQuery 精确//QueryBuilders.matchAllQuery()  匹配所有TermQueryBuilder termQueryBuilder= QueryBuilders.termQuery("username","肖");searchSourceBuilder.query(termQueryBuilder);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));searchRequest.source(searchSourceBuilder);SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);}
}

API总结:其使用规则一般先创建对应的请求Request,例如updateRequest、GetRequest.... 然后请求对象中输入对应的索引值。然后操作各个对象的属性,最后使用client对象进行操作。

3.具体业务实现(个人项目演示)

💡思路:

1.首先需要将数据库中的所有数据,同步到ElasticSearch中。这边先编写好对应的添加类。

2.数据同步完成后,编写相应的搜索业务类。

3.还应该封装一个ES各种操作类,如增删查改等(也可以用现成的ESTemplate)。

💡注意事项:

将文档的id值和数据的id值设为一个值。

在编写ES的操作类时想到一个问题,一个文档数据在es中有一个id值,相当于数据库中每一行的一个主键id值。而操作文档数据需要用到这个id值(发生修改时等),如若文档id值和数据本身的一个id值不一致的话,那么会非常不便。所以需要在批量插入数据的时候,需要将文档id和数据id一一对应。

 //批量插入升级版,文档id值和对象id值一一对应(便于后续删改操作)//其中的id值--指的是在es索引中文档的id值  相当于数据库中每一行数据的id值  需要将这两个id值设为同一个public void bulkByIdDocument(Map<String,Object> map, String index){ConnectElasticSearch.connect(client -> {BulkRequest bulkRequest=new BulkRequest(index);bulkRequest.timeout(EsConfig.DSTimeOut);for (String id : map.keySet()) {Object o = map.get(id);bulkRequest.add(new IndexRequest(index).id(id).source(JSON.toJSONString(map.get(id)),XContentType.JSON));}BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println("添加是否失败=" + bulkResponse.hasFailures()); //返回false代表成功});}

将传入参数改为Map<String,Object>结构,其中String对象的id值。Object为该对象。在外部将List中的对象循环取出依次存入这个map即可。

  public void addPhone(){List<EsPhone> list = esPhoneDao.findAll();Map<String,Object> map=new HashMap<>();for (EsPhone esPhone : list) {map.put(String.valueOf(esPhone.getId()),esPhone);}esService.bulkByIdDocument(map,EsConfig.index);}

结果显示如图:

💡关于分词器与搜索匹配的坑:

在使用term匹配时候,发现输入两个字以上的中文时搜索不出任何东西出来。后续是排查出索引字段是用的默认standard分词器,而默认中文分词器会把中文全部拆开,所以两字以上无法匹配出来。后续又尝试修改索引分词器,但没有效果。最终删除索引,手动创建索引并给相应的字段添加ik分词器后得到解决。

自定义索引创建规则

PUT /xiaomi-phone
{"mappings": {"properties": {"cap":{"type": "text"},"color":{"type": "text"},"price":{"type": "float"},"num":{"type": "long"},"name":{"type": "text","analyzer": "ik_max_word"},"pid":{"type": "long"},"id":{"type": "long"},"brand":{"type": "text", "analyzer": "ik_smart"},"pics":{"type": "text"}}}
}

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

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

相关文章

数据结构之二:表

顺序表代码&#xff1a;SData/SqList/SeqList.h Hera_Yc/bit_C_学习 - 码云 - 开源中国 链表相关代码&#xff1a;SData/ListLink/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 本文主要讲解的是线性表&#xff08;逻辑线性&#xff09;&#xff0c;对于非线性表不做补充。…

《Python基础》之循环结构

目录 简介 一、for循环 1、基本语法与作用 2、使用 range() 函数配合 for 循环 3、嵌套的for循环 二、while循环 1、基本语法与作用 2、while 循环嵌套 &#xff08;1&#xff09;、while循环与while循环嵌套 &#xff08;2&#xff09;、while循环与for循环嵌套 简介 …

基于LiteFlow的风控系统指标版本控制

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 更新日志 最近关于https://github.com/wnhyang/coolGuard此项目更新了如下内容&#xff1a;https://g…

Mysql中的 TEXT 和 BLOB 解析

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

241124_文本解码原理

241124_文本解码原理 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积。 Greedy search 就是每步都选择概率最大的&#xff0c;不会去考虑全局 按照贪心搜索输出the nice woman 的概率就是0.5*0.40.2 这种方法简单&#xff0c;但也存在问题&#xff0c;比…

介绍一下strlwr(arr);(c基础)

hi , I am 36 适合对象c语言初学者 strlwr(arr)&#xff1b;函数是把arr数组变为小写字母 格式 #include<string.h> strlwr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…

16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗

使用外部触发启动ADC 1、外部中断线EXTI11触发ADC2、外部定时器TIM2_CH2触发ADC3、ADC中模拟看门狗的使用 1、外部中断线EXTI11触发ADC ADC的触发方式有很多&#xff0c;一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所…

Linux之管道,system V的共享内存,消息队列和信号量

Linux之管道&#xff0c;systemV共享内存和信号量 一.进程间通信1.1进程间通信的目的1.2进程间通信的方式 二.管道2.1管道的概念2.2匿名管道2.3命名管道 三.system V3.1共享内存3.2消息队列3.3信号量 一.进程间通信 在我们之前有关Linux指令的学习时我们使用过“|”这个命令&a…

使用ChatGPT生成和优化电子商务用户需求规格说明书

在电子商务项目开发中&#xff0c;用户需求规格说明书&#xff08;User Requirement Specification, URS&#xff09;是团队沟通与项目成功的基石。然而&#xff0c;面对复杂多变的需求&#xff0c;如何快速生成清晰、完整且具备说服力的文档&#xff1f;这正是AI工具的用武之地…

1+X应急响应(网络)常见网络攻击-SQL注入:

常见网络攻击-SQL注入&#xff1a; SQL注入概述&#xff1a; 动态网站的工作流程&#xff1a; SQL注入的起源&#xff1a; SQL典型的攻击手段&#xff1a; SQL注入的危害&#xff1a; SQL注入的函数&#xff1a; SQL注入类型&#xff1a; 提交方式分类&#xff1a; Get注入&am…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法

本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时&#xff0c;突然发现它的一个接口&#xff0c;被另一个服务ip频繁的请求。 按理说&#xff0c;之前设置的是&#xff0c;每隔1分钟请求一次接口。但从日志来看&#xff0c;则是1秒钟请求一次&#xff…

单片机GPIO的8种工作模式

1、输入 GPIO_MODE_AIN:模拟输入 GPIO_MODE_IN_FLOATING:浮空输入 GPIO_MODE_IPD:下拉输入 GPIO_MODE_IPU:上拉输入 2、输出 GPIO_MODE_OUT_OD:开漏输出&#xff08;特殊情况使用&#xff09; GPIO_MODE_OUT_PP&#xff1a;推挽输出-----点灯&#xff08;通用&#…

Azkaban部署

首先我们需要现在相关的组件&#xff0c;在这里已经给大家准备好了相关的安装包&#xff0c;有需要的可以自行下载。 只需要启动hadoop集群就可以&#xff0c;如果现在你的hive是打开的&#xff0c;那么请你关闭&#xff01;&#xff01;&#xff01; 如果不关会造成证书冲突…

时钟使能、

时钟使能 如果正确使用&#xff0c;时钟使能能够显著地降低系统功耗&#xff0c;同时对面积或性能的影响极小。但是如果不正确地使用时钟使能&#xff0c; 可能会造成下列后果&#xff1a; • 面积增大 • 密度减小 • 功耗上升 • 性能下降 在许多使用大量控制集的…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

【CSS in Depth 2 精译_060】9.3 详解 CSS 作用域的相关概念、最新 @scope 规则的应用及注意事项

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 9.2.1 模块中多个职责的拆分…

uniapp实现开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案&#xff1a; 在manifest.json文件&#xff0c;找到开源码视图配置&#xff0c;添加如下&#xff1a; "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

React(六)——Redux

文章目录 项目地址基本理解一、配置Redux store二、创建slice配置到store里并使用三、给Slice配置reducers&#xff0c;用来修改初始值 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow基本理解 s…

国家级资质!同驭汽车获得CNAS实验室认证

近日&#xff0c;同驭汽车科技顺利通过中国合格评定国家认可委员会&#xff08;简称CNAS&#xff09;评审&#xff0c;获得《中国合格评定国家认可委员会实验室认可证书》。这标志着同驭已建立国际标准的实验室管理体系&#xff0c;产品的试验与检测技术能力达到了国际认可的准…