依赖
SpringBoot版本:2.4.2
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
44
45
46
47
|
< dependencies > <!--lombok--> < dependency > < groupId >org.projectlombok</ groupId > < artifactId >lombok</ artifactId > < optional >true</ optional > </ dependency > < 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.springframework.boot</ groupId > < artifactId >spring-boot-devtools</ artifactId > < optional >true</ optional > < scope >true</ scope > </ dependency > < dependency > < groupId >com.alibaba</ groupId > < artifactId >fastjson</ artifactId > < version >1.2.47</ version > </ dependency > </ dependencies > < dependencyManagement > < dependencies > < dependency > < groupId >org.springframework.cloud</ groupId > < artifactId >spring-cloud-dependencies</ artifactId > < version >2020.0.1</ version > < type >pom</ type > < scope >import</ scope > </ dependency > < dependency > < groupId >com.alibaba.cloud</ groupId > < artifactId >spring-cloud-alibaba-dependencies</ artifactId > < version >2021.1</ version > < type >pom</ type > < scope >import</ scope > </ dependency > </ dependencies > </ dependencyManagement > |
先了解一下curl方式操作es
与SpringBoot集成
配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; @Configuration public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo( "localhost:9200" ) .build(); return RestClients.create(clientConfiguration).rest(); } } |
实体类
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
|
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; @Data @Document (indexName = "product" , shards = 3 , replicas = 1 ) public class Product { //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id" @Id private Long id; //商品唯一标识 /** * type : 字段数据类型 * analyzer : 分词器类型 * index : 是否索引(默认:true) * Keyword : 短语,不进行分词 */ @Field (type = FieldType.Text, analyzer = "ik_max_word" ) private String title; //商品名称 @Field (type = FieldType.Keyword) private String category; //分类名称 @Field (type = FieldType.Double) private Double price; //商品价格 @Field (type = FieldType.Keyword, index = false ) private String images; //图片地址 } |
测试例子
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
@RestController @RequestMapping public class TestESController { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Resource ProductMapper productMapper; @GetMapping public void createIndex() { //创建索引,系统初始化会自动创建索引 System.out.println( "创建索引" ); } @DeleteMapping public void deleteIndex() { //创建索引,系统初始化会自动创建索引 boolean flg = elasticsearchRestTemplate.deleteIndex(Product. class ); System.out.println( "删除索引 = " + flg); } @PostMapping public void save(){ Product product = new Product(); product.setId(1L); product.setTitle( "华为手机" ); product.setCategory( "手机" ); product.setPrice( 2999.0 ); product.setImages( "http://www.atguigu/hw.jpg" ); productMapper.save(product); } @PutMapping public void update(){ Product product = new Product(); product.setId(1L); product.setTitle( "小米 2 手机" ); product.setCategory( "手机" ); product.setPrice( 9999.0 ); product.setImages( "http://www.atguigu/xm.jpg" ); productMapper.save(product); } @GetMapping ( "/findById" ) public void findById(){ Product product = productMapper.findById(1L).get(); System.out.println(product); } @GetMapping ( "/findAll" ) public void findAll(){ Iterable<Product> products = productMapper.findAll(); for (Product product : products) { System.out.println(product); } } //删除 @DeleteMapping ( "/delDocument" ) public void delete(){ Product product = new Product(); product.setId(1L); productMapper.delete(product); } //批量新增 @PostMapping ( "/addBatch" ) public void saveAll(){ List<Product> productList = new ArrayList<>(); for ( int i = 0 ; i < 10 ; i++) { Product product = new Product(); product.setId(Long.valueOf(i)); product.setTitle( "[" +i+ "]小米手机" ); product.setCategory( "手机" ); product.setPrice( 1999.0 +i); product.setImages( "http://www.atguigu/xm.jpg" ); productList.add(product); } productMapper.saveAll(productList); } //分页查询 @GetMapping ( "/findByPageable" ) public void findByPageable(){ //设置排序(排序方式,正序还是倒序,排序的 id) Sort sort = Sort.by(Sort.Direction.DESC, "id" ); int currentPage= 0 ; //当前页,第一页从 0 开始, 1 表示第二页 int pageSize = 5 ; //每页显示多少条 //设置查询分页 PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort); //分页查询 Page<Product> productPage = productMapper.findAll(pageRequest); for (Product Product : productPage.getContent()) { System.out.println(Product); } } } |
RestHighLevelClient直接操作
这些操作,就是javaApi,和上图中,通过http方式和es交互式类似的
索引操作
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
|
/** * 这里时测试,开发时:通过 ESTemplate操作。Spring进行了封装 */ @Slf4j public class ESIndexTestCase { public static void main(String[] args) throws IOException { // 创建客户端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 ))); // 创建索引 // CreateIndexRequest indexRequest = new CreateIndexRequest("book"); // CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT); // boolean acknowledged = indexResponse.isAcknowledged(); // log.error("响应{}",acknowledged); // 查询索引 // GetIndexRequest getIndexRequest = new GetIndexRequest("book"); // GetIndexResponse getIndexResponse = esClient.indices().get(getIndexRequest, RequestOptions.DEFAULT); // log.info("getAliases:{}",getIndexResponse.getAliases()); // log.info("getMappings:{}",getIndexResponse.getMappings()); // log.info("getSettings:{}",getIndexResponse.getSettings()); // 删除索引 AcknowledgedResponse deleteRes = esClient.indices().delete( new DeleteIndexRequest( "book" ), RequestOptions.DEFAULT); boolean delAck = deleteRes.isAcknowledged(); log.error( "delAck:{}" ,delAck); esClient.close(); } } |
文档操作
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
44
45
46
47
|
@Slf4j public class ESDocmentTestCase { public static void main(String[] args) throws IOException { // 创建客户端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 ))); // 新增文档 // IndexRequest indexRequest = new IndexRequest("user"); // indexRequest.id("1001"); // // 准备文档 // User user = new User(); // user.setName("张三"); // user.setAge(22); // user.setSex("男"); // String userJson = JSONObject.toJSONString(user); // indexRequest.source(userJson, XContentType.JSON); // IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT); // log.error("getResult:==========>:{}",indexResponse.getResult()); // 批量新增文档 BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add( new IndexRequest( "user" ).id( "2001" ).source(XContentType.JSON, "name" , "张三" , "age" , "40" , "sex" , "男" )); bulkRequest.add( new IndexRequest( "user" ).id( "2002" ).source(XContentType.JSON, "name" , "222" , "age" , "10" , "sex" , "女" )); bulkRequest.add( new IndexRequest( "user" ).id( "2003" ).source(XContentType.JSON, "name" , "33333" , "age" , "20" , "sex" , "男" )); bulkRequest.add( new IndexRequest( "user" ).id( "2004" ).source(XContentType.JSON, "name" , "111" , "age" , "30" , "sex" , "男" )); bulkRequest.add( new IndexRequest( "user" ).id( "2005" ).source(XContentType.JSON, "name" , "2222" , "age" , "31" , "sex" , "女" )); BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT); log.error( "getResult:==========>:{}" ,bulkResponse.getTook()); // 更新文档(全量更新,局部更新) // UpdateRequest updateRequest = new UpdateRequest("user", "1001"); // updateRequest.doc("sex","dddddd"); // UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT); // log.error("getResult:==========>:{}",updateResponse.getResult()); // 根据_id查询文档 // GetRequest getRequest = new GetRequest("user", "1001"); // GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT); // log.error("getResult:==========>:{}",getResponse.getSource()); // 根据_id 删除数据 // DeleteRequest deleteRequest = new DeleteRequest("user", "1001"); // DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT); // log.error("getResult:==========>:{}",deleteResponse.getResult()); // 批量删除(和批量新增类似) esClient.close(); } } |
检索操作
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
44
45
46
47
48
49
50
51
|
@Slf4j public class EsSearchTest { public static void main(String[] args) throws IOException { // 创建客户端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 ))); // 查询所有 // SearchRequest searchRequest = new SearchRequest("user"); // SearchSourceBuilder queryBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); // queryBuilder.from(0); // queryBuilder.size(4); // queryaBuilder.sort("age", SortOrder.DESC); // SearchRequest sourceRequest = searchRequest.source(queryBuilder); // SearchResponse searchResponse = esClient.search(sourceRequest, RequestOptions.DEFAULT); // log.error("getHits:======>{}", searchResponse.getHits().getTotalHits()); // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString())); // 2-组合查询 // SearchRequest searchRequest = new SearchRequest("user"); // BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // // 这里就是组合条件。和mysql where 组合类似 // boolQueryBuilder.should(QueryBuilders.matchQuery("age","30")); // boolQueryBuilder.should(QueryBuilders.matchQuery("age","40")); // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder); // searchRequest.source(sourceBuilder); // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); // searchResponse.getHits().forEach(hit -> System.err.println(hit.getSourceAsString())); // 3-范围查询 // SearchRequest searchRequest = new SearchRequest("user"); // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age"); // rangeQuery.gte("30"); // sourceBuilder.query(rangeQuery); // searchRequest.source(sourceBuilder); // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString())); //4-模糊查询+高亮 SearchRequest searchRequest = new SearchRequest( "user" ); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery( "name" , "张三" ); sourceBuilder.query(fuzzyQuery); HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags( "<font color='red'>" ); highlightBuilder.postTags( "</font>" ); highlightBuilder.field( "name" ); sourceBuilder.highlighter(highlightBuilder); searchRequest.source(sourceBuilder); SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); searchResponse.getHits().forEach(System.out::println); // 5-聚合查询 esClient.close(); } } |
内容来自B站
https://www.bilibili.com/video/BV1hh411D7sb?p=62
以上就是SpringBoot集成ElasticSearch实现过程示例详解的详细内容,更多关于SpringBoot框架集成ES的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/A_java_c/article/details/121067827