依賴
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(); } } |
實(shí)體類
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 是全局唯一的標(biāo)識,等同于 es 中的"_id" @Id private Long id; //商品唯一標(biāo)識 /** * type : 字段數(shù)據(jù)類型 * analyzer : 分詞器類型 * index : 是否索引(默認(rèn):true) * Keyword : 短語,不進(jìn)行分詞 */ @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; //圖片地址 } |
測試?yán)?/h3>
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() {
//創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引
System.out.println(
"創(chuàng)建索引"
);
}
@DeleteMapping
public
void
deleteIndex() {
//創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引
boolean
flg = elasticsearchRestTemplate.deleteIndex(Product.
class
);
System.out.println(
"刪除索引 = "
+ flg);
}
@PostMapping
public
void
save(){
Product product =
new
Product();
product.setId(1L);
product.setTitle(
"華為手機(jī)"
);
product.setCategory(
"手機(jī)"
);
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 手機(jī)"
);
product.setCategory(
"手機(jī)"
);
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+
"]小米手機(jī)"
);
product.setCategory(
"手機(jī)"
);
product.setPrice(
1999.0
+i);
product.setImages(
"http://www.atguigu/xm.jpg"
);
productList.add(product);
}
productMapper.saveAll(productList);
}
//分頁查詢
@GetMapping
(
"/findByPageable"
)
public
void
findByPageable(){
//設(shè)置排序(排序方式,正序還是倒序,排序的 id)
Sort sort = Sort.by(Sort.Direction.DESC,
"id"
);
int
currentPage=
0
;
//當(dāng)前頁,第一頁從 0 開始, 1 表示第二頁
int
pageSize =
5
;
//每頁顯示多少條
//設(shè)置查詢分頁
PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);
//分頁查詢
Page<Product> productPage = productMapper.findAll(pageRequest);
for
(Product Product : productPage.getContent()) {
System.out.println(Product);
}
}
}
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() { //創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引 System.out.println( "創(chuàng)建索引" ); } @DeleteMapping public void deleteIndex() { //創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引 boolean flg = elasticsearchRestTemplate.deleteIndex(Product. class ); System.out.println( "刪除索引 = " + flg); } @PostMapping public void save(){ Product product = new Product(); product.setId(1L); product.setTitle( "華為手機(jī)" ); product.setCategory( "手機(jī)" ); 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 手機(jī)" ); product.setCategory( "手機(jī)" ); 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+ "]小米手機(jī)" ); product.setCategory( "手機(jī)" ); product.setPrice( 1999.0 +i); product.setImages( "http://www.atguigu/xm.jpg" ); productList.add(product); } productMapper.saveAll(productList); } //分頁查詢 @GetMapping ( "/findByPageable" ) public void findByPageable(){ //設(shè)置排序(排序方式,正序還是倒序,排序的 id) Sort sort = Sort.by(Sort.Direction.DESC, "id" ); int currentPage= 0 ; //當(dāng)前頁,第一頁從 0 開始, 1 表示第二頁 int pageSize = 5 ; //每頁顯示多少條 //設(shè)置查詢分頁 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
|
/** * 這里時測試,開發(fā)時:通過 ESTemplate操作。Spring進(jìn)行了封裝 */ @Slf4j public class ESIndexTestCase { public static void main(String[] args) throws IOException { // 創(chuàng)建客戶端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 ))); // 創(chuàng)建索引 // CreateIndexRequest indexRequest = new CreateIndexRequest("book"); // CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT); // boolean acknowledged = indexResponse.isAcknowledged(); // log.error("響應(yīng){}",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 { // 創(chuàng)建客戶端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 ))); // 新增文檔 // IndexRequest indexRequest = new IndexRequest("user"); // indexRequest.id("1001"); // // 準(zhǔn)備文檔 // 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()); // 根據(jù)_id查詢文檔 // GetRequest getRequest = new GetRequest("user", "1001"); // GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT); // log.error("getResult:==========>:{}",getResponse.getSource()); // 根據(jù)_id 刪除數(shù)據(jù) // 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 { // 創(chuàng)建客戶端 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(); } } |
內(nèi)容來自B站
https://www.bilibili.com/video/BV1hh411D7sb?p=62
以上就是SpringBoot集成ElasticSearch實(shí)現(xiàn)過程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot框架集成ES的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://blog.csdn.net/A_java_c/article/details/121067827