SpringBoot2.x RestClient 操作ElasticSearch 7.x

2024-01-09 21:08

本文主要是介绍SpringBoot2.x RestClient 操作ElasticSearch 7.x,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SpringBoot2.x RestClient 操作ElasticSearch 7.x

  • 本地环境
  • ES新版和老板差异
    • 7.6.2 版本
    • 老版本
  • 使用 RestClient
    • 导入依赖
    • yml配置
    • rest新建索引文档
    • 判断索引是否存在
    • 查找
    • 高亮

本地环境

Spring Boot 2.2.6
Elasticsearch 7.6.2
写这个文章的原因是
“The well known TransportClient is deprecated as of Elasticsearch 7 and will be removed in Elasticsearch 8. (see the Elasticsearch documentation). Spring Data Elasticsearch will support the TransportClient as long as it is available in the used Elasticsearch version.
We strongly recommend to use the High Level REST Client instead of the TransportClient.”
但是网上关于RestClient的资料却很少

ES新版和老板差异

先说建立索引,新版不允许带有type名,我们通过代码对比,代码很简洁

7.6.2 版本

PUT http://localhost:9200/test/
{"mappings":{"properties":{"id":{"type": "long","index": true},"title":{"type": "text"}}}
}

老版本

PUT http://localhost:9200/test/
{"mappings":{"lalala":{"properties":{"id":{"type": "long","index": true},"title":{"type": "text"}}}}
}

还有常用的一点:minimum_match 新版本需要使用 minimum_should_match

使用 RestClient

导入依赖

导入依赖 这个不用说了,以前还需要Jest 包

    	<properties>.......<!--自定义elasticsearch.version版本--><!--其实不自定义默认的6.8x也可以使用我们不自定义看看连接7.6.2版本会不会出问题--><!--<elasticsearch.version>7.6.2</elasticsearch.version>--></properties><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>

yml配置

为了和老版本对比jest我没有去掉,事实上jest的uris明确表明已过时

spring:elasticsearch:jest:uris: http://localhost:9200rest:uris: http://localhost:9200

rest新建索引文档

  • 注意:代码中的JestEntity只是一个普通的实体类,你们可以自己写一个,并不是Jest包中的东西
    下面的代码我没有使用CreateIndexRequest,而是直接创建文档了
	@Autowiredprivate RestHighLevelClient restClient;@Testpublic void testRestCreate(){JestEntity entity = new JestEntity();entity.setId(1);entity.setTitle("我是文章标题");ObjectMapper mapper=new ObjectMapper();String source = mapper.writeValueAsString(entity);// 1. 建立IndexRequest//注意这里的type 事实上在es7中就是文档,type已经被弃用//这里的source是个json,我懒得引入fastjson用jackson做了//如果在xml修改了es版本号,这里可以只写2个变量,index和idIndexRequest request = new IndexRequest("test", "_doc", "1").source(source, XContentType.JSON).setRefreshPolicy(IMMEDIATE);//发送请求try {IndexResponse res = restClient.index(request, RequestOptions.DEFAULT);System.out.println(res);} catch (IOException e) {e.printStackTrace();}// 异步方式/*ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {@Overridepublic void onResponse(IndexResponse indexResponse) {System.out.println("调用完成");System.out.println(indexResponse);}@Overridepublic void onFailure(Exception e) {e.printStackTrace();}};restClient.indexAsync(request,RequestOptions.DEFAULT,listener);*/}

判断索引是否存在

	@Testpublic void testRestExists(){GetIndexRequest request = new GetIndexRequest("test");//注意 我这里用的是indices方法,故意换个方法,让大家了解一下CreateIndexResponse res = restClient.indices().exists(request,RequestOptions.DEFAULT);System.out.println(res);}

查找

	@Testpublic void testRestSearch(){SearchRequest searchRequest = new SearchRequest("test");//ES7 不需要types 是为了兼容老版本的东西//如果写了会抛异常并且卡死在这//searchRequest.types("_doc"); SearchSourceBuilder searchSource = new SearchSourceBuilder();//匹配所有//searchSource.query(QueryBuilders.matchAllQuery());//只匹配titlesearchSource.query(QueryBuilders.matchQuery("title", "文章"));searchRequest.source(searchSource);try {SearchResponse res = restClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println(res);} catch (IOException e) {e.printStackTrace();}}

高亮

highlightBuilder.field 新版本必须设置,否则会获取不到高亮内容

@Testpublic void testRestSearch() throws IOException {//创建搜索请求SearchRequest searchRequest = new SearchRequest("Hoola");//searchRequest.types("_doc"); ES7 不需要 是为了兼容老版本的东西//创建搜索源SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建高亮并设置fieldHighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("tag").field("title");//不设置会获取不到highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");//设置搜索条件,故意写的复杂一些,让你们看看restClient的搜索searchSourceBuilder.query(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("tag", "抠脚 大汉")).should(QueryBuilders.matchQuery("title", "蛇皮 香蕉 象拔蚌")).minimumShouldMatch(1)).highlighter(highlightBuilder).from(0).size(10);//绑定搜索源searchRequest.source(searchSourceBuilder);SearchResponse res = restClient.search(searchRequest, RequestOptions.DEFAULT);//获取内容for (SearchHit hit:res.getHits().getHits()){Map<String, Object> sourceAsMap = hit.getSourceAsMap();Map<String, HighlightField> highlightFields = hit.getHighlightFields();//判断高亮是否存在,存在就替换到map中去if (highlightFields.get("title")!=null){sourceAsMap.put("title",highlightFields.get("title").fragments());}if (highlightFields.get("tag")!=null){sourceAsMap.put("tag",highlightFields.get("tag").fragments());}JestEntity jestEntity = new JestEntity();try {//map数据迁移到实体对象里。BeanUtils.populate(jestEntity, sourceAsMap);System.out.println(jestEntity);} catch (IllegalAccessException|InvocationTargetException e) {e.printStackTrace();} }}

这篇关于SpringBoot2.x RestClient 操作ElasticSearch 7.x的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/588435

相关文章

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查