SpringBoot集成ElasticSearch的四种方式(主要讲解ES官方推荐方式)
- TransportClient:这种方式即将弃用、官方将在8.0版本彻底去掉这个api
- Data-Es:Spring提供的封装的方式(Springboot-data),由于是Spring提供的,所以每个SpringBoot版本对应的ElasticSearch,具体这么个对应的版本,自己去官网看
- ElasticSearch SQL:将Elasticsearch的
Query DSL
用SQL
转换查询,早期有一个第三方的插件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依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.15</version> </dependency> </dependencies>
|
pom导包完成后、需要点开Maven查看引入的elasticsearch-rest-high-level-client的版本是否与你的ElasticSearch版本一致

如果不一致需要自己去控制版本(如下代码)
1 2 3 4 5
| <properties> <java.version>1.8</java.version> <elasticsearch.version>7.6.1</elasticsearch.version> </properties>
|
3.SpringBoot项目的启动类编写(忽略)
4.编写配置类(RestHighLevelClient)
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration public class RestElasticSearchClientConfig { @Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder( new HttpHost("localhost", 9200, "http"))); return restHighLevelClient; } }
|
到这里我们RestHighLevelClient的配置就做完了
5.测试(使用RestHighLevelClient的Api)
编写测试类,在类中自动注入RestHighLevelClient对象

6.RestHighLevelClient的Api使用(关于索引)
6.1 简单索引的创建
1 2 3 4 5 6 7 8 9
| @Test void testCreateIndex() throws IOException { CreateIndexRequest nan_index = new CreateIndexRequest("nan_index"); CreateIndexResponse response = restHighLevelClient.indices().create(nan_index, RequestOptions.DEFAULT); System.out.println(response); }
|
6.2自定义mapping创建索引
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @Test void testCreateMappingIndex() throws IOException { CreateIndexRequest indexRequest = new CreateIndexRequest("nanmapping_index"); String mapping = "{\n" + " \"properties\": {\n" + " \"name\": {\n" + " \"type\": \"keyword\"\n" + " },\n" + " \"age\": {\n" + " \"type\": \"integer\"\n" + " }\n" + " }\n" + " }"; indexRequest.mapping(mapping,XContentType.JSON); CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest, RequestOptions.DEFAULT); System.out.println(response); }
|
6.3测试索引是否存在
1 2 3 4 5 6 7 8 9
| @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索引的删除
1 2 3 4 5 6 7 8 9
| @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文档的添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void testCreateDoc() throws IOException { User user = new User("小杰", 23, "你要是这么想我也没办法", new String[]{"md", "渣男"}); 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文档的修改(更新)(全局更新)
1 2 3 4 5 6 7 8 9 10 11 12
|
@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文档数据的更新(局部更新)(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
@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文档数据的删除
1 2 3 4 5 6 7
| @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获取文档数据(简单)
1 2 3 4 5 6 7 8
| @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批量添加文档数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @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(); 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文档数据的查询(带条件)重点(后面的都是重点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
@Test public void testGetListDoc() throws IOException { SearchRequest searchRequest = new SearchRequest("nan_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "xiaomei");
searchSourceBuilder.query(termsQueryBuilder);
searchSourceBuilder.from(0); 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字段过滤(当我们想要查询的结果中的字段不是所有的,只有表中的部分字段)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| @Test public void testFilterDoc() throws IOException { SearchRequest searchRequest = new SearchRequest().indices("nan_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(matchAllQueryBuilder);
String[] excludes = {}; String[] includes = {"name"}; searchSourceBuilder.fetchSource(includes,excludes);
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多条件查询(也叫组合查询)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @Test public void testBoolqueryDoc() throws IOException { SearchRequest searchRequest = new SearchRequest("nan_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must(QueryBuilders.termsQuery("name","xiaofei"));
boolQueryBuilder.should(QueryBuilders.termsQuery("age","24")); boolQueryBuilder.should(QueryBuilders.termsQuery("age","28")); 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 范围查询(就是某个字段在什么范围内)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Test public void testRangeDoc() throws IOException { SearchRequest searchRequest = new SearchRequest("nan_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age"); 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模糊查询
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Test public 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高亮查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| @Test public 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最大值、平均值、最小值查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void testAggraDoc() throws IOException { SearchRequest searchRequest = new SearchRequest("nan_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("MAXAGE").field("age"); 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分组查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Test public void testAggraGroupDoc() throws IOException { SearchRequest searchRequest = new SearchRequest("nan_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("AGEGROUP").field("age"); 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()); } }
|