SpringBoot集成ElasticSearch的四种方式(主要讲解ES官方推荐方式)


  • TransportClient:这种方式即将弃用 官方将在8.0版本彻底去除
  • Data-Es:Spring提供的封装的方式,由于是Spring提供的,所以每个SpringBoot版本对应的ElasticSearch,具体这么个对应的版本,自己去官网看
  • ElasticSearch SQL:将Elasticsearch的Query DSLSQL转换查询,早期有一个第三方的插件Elasticsearch-SQL,后来随着官方也开始做这方面,这个插件好像就没怎么更新了,有兴趣的可以查看https://www.cnblogs.com/jajian/p/10053504.html
  • Rest Client:官方推荐使用,所以我们采用这个方式,这个分为两个Low Level REST Client和High Level REST Client,Low Level REST Client是早期出的API比较简陋了,还需要自己去拼写Query DSL,High Level REST Client使用起来更好用,更符合面向对象的感觉,我们下面使用High Rest Client

注意:我使用的是ES7.6.1版本,等会pom文件依赖时,版本必须与之对应

1.创建Maven项目

2.导入pom依赖

<dependencies><!--SpringBoot集成Es的包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!--springbootweb包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test测试包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--json序列化包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.15</version></dependency>
</dependencies>

pom导包完成后、需要点开Maven查看引入的elasticsearch-rest-high-level-client的版本是否与你的ElasticSearch版本一致

如果不一致需要自己去控制版本(如下代码)

<properties><java.version>1.8</java.version><!--这里是你的es的版本--><elasticsearch.version>7.6.1</elasticsearch.version>
</properties>

3.SpringBoot项目的启动类编写(忽略)

4.编写配置类(RestHighLevelClient)

// 表示这是一个配置类
@Configuration
public class RestElasticSearchClientConfig {// 将方法的返回结果交给spring管理@Beanpublic RestHighLevelClient restHighLevelClient(){// 主机ip和端口号以及协议RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));return restHighLevelClient;}
}

到这里我们RestHighLevelClient的配置就做完了

5.测试(使用RestHighLevelClient的Api)

编写测试类,在类中自动注入RestHighLevelClient对象

6.RestHighLevelClient的Api使用(关于索引)

6.1 简单索引的创建
// 测试索引的创建(不带mapping,ElasticSearch默认会根据你的添加的文档来创建mapping)
@Test
void testCreateIndex() throws IOException {// 创建索引的请求CreateIndexRequest nan_index = new CreateIndexRequest("nan_index");// client执行请求CreateIndexResponse response = restHighLevelClient.indices().create(nan_index, RequestOptions.DEFAULT);System.out.println(response);
}
6.2自定义mapping创建索引
// 带上自定义的mapping来创建索引
@Test
void testCreateMappingIndex() throws IOException {// 创建索引的请求CreateIndexRequest indexRequest = new CreateIndexRequest("nanmapping_index");// mapping规则去别的地方写好之后,复制粘贴过来,IDEA会自动转义相关符号String mapping = "{\n" +"    \"properties\": {\n" +"      \"name\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"age\": {\n" +"        \"type\": \"integer\"\n" +"      }\n" +"    }\n" +"  }";// 添加索引的mapping规则indexRequest.mapping(mapping,XContentType.JSON);// 发送请求CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest, RequestOptions.DEFAULT);System.out.println(response);
}
6.3测试索引是否存在
// 测试索引是否存在
@Test
void testExitIndex() throws IOException {// 获取索引的请求GetIndexRequest nan_index = new GetIndexRequest("nan_index");// 执行请求boolean exists = restHighLevelClient.indices().exists(nan_index, RequestOptions.DEFAULT);System.out.println(exists);
}
6.4索引的删除
// 测试删除索引
@Test
void testDeleteIndex() throws IOException {// 删除索引的请求DeleteIndexRequest nan_index = new DeleteIndexRequest("nan_index");// 执行删除的请求AcknowledgedResponse response = restHighLevelClient.indices().delete(nan_index, RequestOptions.DEFAULT);System.out.println(response);
}

7.RestHighLevelClient的Api使用(关于文档数据)

7.1文档的添加
// 测试文档的添加
@Test
public void testCreateDoc() throws IOException {// 准备好数据User user = new User("小杰", 23, "你要是这么想我也没办法", new String[]{"md", "渣男"});// 创建好index请求IndexRequest indexRequest = new IndexRequest("nan_index");// 设置索引indexRequest.id("1");// 设置超时时间(默认)indexRequest.timeout(TimeValue.timeValueSeconds(5));// 往请求中添加数据indexRequest.source(JSON.toJSONString(user), XContentType.JSON);//执行添加请求IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);System.out.println(indexResponse);
}
7.2文档的修改(更新)(全局更新)
// 测试文档的更新(id存在就是更新,id不存在就是添加)(用下面这个方法更新时,是全局更新,就是说里面的字段全部被覆盖
// 新对象里没有的字段就没有了)
@Test
public void testUpdateDoc() throws IOException {User user = new User("xiaoer", 18);IndexRequest indexRequest = new IndexRequest("nan_index");indexRequest.id("2");indexRequest.source(JSON.toJSONString(user),XContentType.JSON);IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);System.out.println(indexResponse);}
7.3文档数据的更新(局部更新)(推荐)
// 测试文档的更新(id存在就是更新,id不存在就是添加)
// (用下面这个方法更新时,是局部更新,就是说只会覆盖其中有的字段)
@Test
public void testUpdateBetterDoc() throws IOException {//准备好修改的数据User user = new User("xiaoer", 18);// 创建更新请求UpdateRequest updateRequest = new UpdateRequest("nan_index", "1");// 把要更新的数据装进去updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);// 执行更新语句UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);System.out.println(updateResponse);
}
7.4文档数据的删除
// 测试文档删除
@Test
public void testDelDoc() throws IOException {DeleteRequest deleteRequest = new DeleteRequest("nan_index","2");DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(deleteResponse);
}
7.5根据id获取文档数据(简单)
//获取简单文档数据
@Test
public void testGetDoc() throws IOException {GetRequest getRequest = new GetRequest("nan_index");getRequest.id("1");GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);System.out.println(getResponse);
}
7.6批量添加文档数据
// 测试文档批量添加(添加会了,批量删除、更新、修改是一样的)
@Test
public void testBulkAdd() throws IOException {// 准备要添加的数据List<User> users = new ArrayList<>();users.add(new User("xiaofei",25,"每天都是正能量",new String[]{"加油","早起晚睡"}));users.add(new User("xiaohua",22,"xiaohua",new String[]{"html","早起晚睡"}));users.add(new User("xiaoer",23,"我是菜鸟",new String[]{"宅男","早起晚睡"}));users.add(new User("xiaoge",22,"一看工资2500",new String[]{"加油","渣男"}));users.add(new User("xiaomei",23,"给我钱就行",new String[]{"hh","早起晚睡"}));// 创建批量请求BulkRequest bulkRequest = new BulkRequest();// 利用循环将每一个add请求添加到bulkRequest请求中for (int i = 0; i < users.size(); i++) {IndexRequest indexRequest = new IndexRequest("nan_index").id(""+i);indexRequest.source(JSON.toJSONString(users.get(i)),XContentType.JSON);bulkRequest.add(indexRequest);}// 执行批量请求BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulkResponse);
}
7.7文档数据的查询(带条件)重点(后面的都很重要)
// 测试文档列表的查询(带条件)// 这是ElasticSearch最重要的地方@Testpublic void testGetListDoc() throws IOException {SearchRequest searchRequest = new SearchRequest("nan_index");// 构建搜索builderSearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询条件(查询所有)//  MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();// 构建查询条件(精确匹配)TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "xiaomei");// 把查询条件设置给搜索buildersearchSourceBuilder.query(termsQueryBuilder);// 设置分页查询(跟sql语句的limit一样)searchSourceBuilder.from(0); // 开始下标(当前页码-1)*每页显示条数searchSourceBuilder.size(3); // 要查多少个// 设置排序规则searchSourceBuilder.sort("age",SortOrder.DESC);// 把所有条件设置给查询请求searchRequest.source(searchSourceBuilder);// 开始查询SearchResponse searchResponse =restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 查看结果(结果很多,所以循环)SearchHits hits = searchResponse.getHits();for (SearchHit hit: hits) {System.out.println(hit.getSourceAsString());}}
7.8字段过滤(当我们想要查询的结果中的字段不是所有的,只有表中的部分字段)
// 测试过滤查询出来的字段(也就是当我们不想把表中所有的字段查出来)
@Test
public void testFilterDoc() throws IOException {// 构建搜索查询请求SearchRequest searchRequest = new SearchRequest().indices("nan_index");// 构建查询条件builderSearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建真正的查询条件(这里是全部查询)MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();// 把查询条件设置给buildersearchSourceBuilder.query(matchAllQueryBuilder);// 设置过滤字段String[] excludes = {};String[] includes = {"name"};searchSourceBuilder.fetchSource(includes,excludes);// 把所有的查询条件builder设置给查询请求searchRequest.source(searchSourceBuilder);//执行请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//打印结果SearchHits hits = searchResponse.getHits();for (SearchHit hit:hits) {System.out.println(hit.getSourceAsString());}
}
7.9多条件查询(也叫组合查询)
// 多条件查询,也叫组合查询@Testpublic void testBoolqueryDoc() throws IOException {// 构建查询请求SearchRequest searchRequest = new SearchRequest("nan_index");// 构建搜索条件builderSearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建多条件builderBoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();// 在多条件builder中设置满足条件// must 就是必须满足这个条件(相当于mysql中column = 值)// mustnot 就是必须不满足这个条件(相当于mysql中column!=值)// should 就是或者的意思(相当于mysql中的or)boolQueryBuilder.must(QueryBuilders.termsQuery("name","xiaofei"));
//        boolQueryBuilder.must(QueryBuilders.termsQuery("age","24"));boolQueryBuilder.should(QueryBuilders.termsQuery("age","24"));boolQueryBuilder.should(QueryBuilders.termsQuery("age","28"));// 把多条件查询条件放到builder中searchSourceBuilder.query(boolQueryBuilder);// 把所有搜索条件设置到查询请求中searchRequest.source(searchSourceBuilder);// 执行请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 打印结果SearchHits hits = searchResponse.getHits();for(SearchHit hit :hits){System.out.println(hit.getSourceAsString());}}
7.10 范围查询(就是某个字段在什么范围内)
// 范围查询
@Test
public void testRangeDoc() throws IOException {// 构建查询请求SearchRequest searchRequest = new SearchRequest("nan_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 设置到范围的字段RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age");// 设置范围()gte就是大于等于rangeQueryBuilder.gte(24);rangeQueryBuilder.lte(30);// 把范围查询设置到条件中searchSourceBuilder.query(rangeQueryBuilder);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();for(SearchHit hit :hits){System.out.println(hit.getSourceAsString());}
}
7.11模糊查询
// 模糊查询@Testpublic void testLikeDoc() throws IOException {SearchRequest searchRequest = new SearchRequest("nan_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "xiao").fuzziness(Fuzziness.TWO);searchSourceBuilder.query(fuzzyQueryBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();for(SearchHit hit :hits){System.out.println(hit.getSourceAsString());}}
7.12高亮查询
//高亮查询@Testpublic void testHighLightDoc() throws IOException {// 构建搜索请求SearchRequest searchRequest = new SearchRequest("nan_index");// 构建搜索条件构造器(也就是总的搜索条件)SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建单独的一个高亮构建器HighlightBuilder highlightBuilder = new HighlightBuilder();// 设置高亮字段highlightBuilder.preTags("<font color='red'>"); //前缀highlightBuilder.postTags("</font>");   // 后缀highlightBuilder.field("name");// 把单独的高亮构建器设置给总构建器searchSourceBuilder.highlighter(highlightBuilder);searchSourceBuilder.query(QueryBuilders.matchAllQuery());// 把总的搜索条件给到搜索请求中searchRequest.source(searchSourceBuilder);// 执行请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 打印结果SearchHits hits = searchResponse.getHits();for(SearchHit hit :hits){System.out.println(hit.getSourceAsString());// 获取对应的高亮域Map<String, HighlightField> highlightFields = hit.getHighlightFields();System.out.println(highlightFields);// 获取对应的高亮字段HighlightField highlightField = highlightFields.get("name");if(highlightField != null) {// 拿到高亮字段的文本域Text[] texts = highlightField.getFragments();String name = "";for (Text text : texts) {name += text;// 打印高亮字段System.out.println(name);}}}}
7.13最大值、平均值、最小值查询
// 最大值、平均值、最小值
@Test
public void testAggraDoc() throws IOException {SearchRequest searchRequest = new SearchRequest("nan_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建一个最大值builderMaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("MAXAGE").field("age");// 把最大值builder设置给总查询条件searchSourceBuilder.aggregation(maxAggregationBuilder);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();for(SearchHit hit : hits){System.out.println(hit.getSourceAsString());}
}
7.14分组查询
// 分组查询
@Test
public void testAggraGroupDoc() throws IOException {SearchRequest searchRequest = new SearchRequest("nan_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建一个分组builder// terms里面的参数是给分组取的名字、后面field是要分组的字段TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("AGEGROUP").field("age");// 把分组builder设置给总查询条件searchSourceBuilder.aggregation(termsAggregationBuilder);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();for(SearchHit hit : hits){System.out.println(hit.getSourceAsString());}
}

Java使用Springboot集成Es官方推荐(RestHighLevelClient)相关推荐

  1. SpringBoot 集成 ES 7.6.2 并对字段进行中文和拼音分词处理

    前言 在最近做的流媒体项目中需要集成 ES 搜索引擎,目前 ES 最新版本为 7.x 版本,在以往的项目中我都采用的是 spring 集成的 spring-data-es, 使用自定义类集成 elas ...

  2. ElasticSearch - SpringBoot集成ES

    文章目录 ElasticSearch - SpringBoot集成ES 1.整体设计思路(仿NBA中国官网) 2.项目搭建 3.ES API的基本使用 3.1 新增球员信息 3.2 查看球员信息 3. ...

  3. SpringBoot集成ES 7.6.2 并对字段进行中文和拼音分词处理

    文章目录 前言 一.为什么不用spring封装的spring-data-es? 二.springboot集成es的两种方式 1.spring-data-es使用elasticsearch 2.doc对 ...

  4. SpringBoot 集成ES集群CRUD及分页解决方案

    1 SpringBoot 集成ES集群 1.2 pom <parent><groupId>org.springframework.boot</groupId>< ...

  5. SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决

    SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决 错误: Caused by: org.springframework.beans.factory. ...

  6. 从ElasticSearch 认识到实战(SpringBoot集成ES)

    ElasticSearch 认识到实战 目录 搜索引擎介绍 ElasticSearch知识 安装 使用restful风格查询ES SpringBoot配置ES SpringBoot集成使用 一.搜索引 ...

  7. SpringBoot集成ES+京东搜索

    SpringBoot集成elasticsearch 引入依赖 <dependency><groupId>com.alibaba</groupId><artif ...

  8. springboot集成ES实现磁盘文件全文检索

    有个朋友咨询如何实现对海量磁盘资料进行目录.文件名及文件正文进行搜索,要求实现简单高效.维护方便.成本低廉.我想了想利用ES来实现文档的索引及搜索是适当的选择,于是就着手写了一些代码来实现,下面就将设 ...

  9. Elastic stack技术栈学习(十)— springboot集成ES API详解

    目录 一.关于索引的API详解 1.1 声明客户端 1.2 创建索引 1.3 获取文档 / 判断文档是否存在 ​1.4 删除索引 二.关于文档的API详解 2.1 添加文档 2.2 判断文档是否存在 ...

最新文章

  1. Java笔试面试总结—try、catch、finally语句中有return 的各类情况
  2. 使用VMware Infrastructure Client中的VMware Server 2.0.x的管理
  3. android 虚拟机快捷键中英列表
  4. python资料txt下载-python全教程下载-哪里有Python教程txt下载
  5. @getmapping注解的作用_一口气说出6种,@Transactional注解的失效场景
  6. 汇编访问计算机端口,汇编总结(2):中断、端口、直接定址表
  7. think in uml-关系
  8. 斯坦福的著名小兔子模型的点云数据_传统方法的点云分割以及PCL中分割模块
  9. 将传统 ASP.NET 应用迁移到 .NET Core
  10. 2018蓝桥杯省赛---java---A---1(分数)
  11. Linux zip命令:压缩文件或目录
  12. Lecture Notes: Macros
  13. 单服务器部署rancher_基于CentOS 7部署Rancher 2.0
  14. 数据分析师市场需求研究
  15. lintcode,翻转二叉树
  16. Lua中的os.time和os.date以及时区计算
  17. 7-8 约分最简分式 (15 分)
  18. S@Kura的PHP进阶之路(三)
  19. 狂言NBA-阿King从笑话变神话 只因他抛开一切算计
  20. 怎样的年轻化法则,让这个品牌四年净利润复合增速达30%

热门文章

  1. 数据挖掘算法之关联规则挖掘(一)apriori算法
  2. [置顶] 有关ListIterator接口的add与remove方法探究
  3. 用css3实现的简单的云朵
  4. JNI开发笔记(八)--Java读取txt文件进行JNI测试
  5. LeetCode--80. 删除排序数组中的重复项Ⅱ(双指针,暴力)
  6. 7-7 念数字 (10 分)
  7. 项目部署—Linux命令安装redis
  8. oracle clusterware 11g,Oracle11gR2clusterware启动顺序
  9. git tag什么时候使用_git使用教程9pycharm 使用 tag 打标签
  10. kido机器人没反应_机器人不能钩的三个英雄,章鱼妈上榜,钩中图四我方直接团灭!...