javascript
Spring Boot ES 实战,值得参考!
作者:廢物大師兄?
cnblogs.com/cjsblog/p/9756978.html
1. 前言
1.1. 集成方式
Spring Boot中集成Elasticsearch有4種方式:
-
REST Client
-
Jest
-
Spring Data
-
Spring Data Elasticsearch Repositories
本文用后面兩種方式來分別連接并操作Elasticsearch
1.2. 環境與配置
服務端:elasticsearch-6.3.2 1臺
客戶端:elasticsearch 6.4.1
服務端配置文件:elasticsearch.yml
cluster.name:?my-application network.host:?192.168.1.134 http.port:?9200/etc/security/limits.conf
cheng?soft?nofile?65536 cheng?hard?nofile?65536/etc/sysctl.conf
vm.max_map_count=2621441.3. 版本
Spring Boot 2.0.5默認的elasticsearch版本很低,這里我們用最新版本6.4.1
如果啟動過程中出現
java.lang.NoClassDefFoundError: org/elasticsearch/common/transport/InetSocketTransportAddress
則說明,elasticsearch依賴的jar包版本不一致,統一改成6.4.1即可
另外,Spring Boot 2.0.5依賴的spring-data-elasticsearch版本是3.0.1,需要升級到3.1.0
?
2. 依賴
<?xml?version="1.0"?encoding="UTF-8"?> <project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cjs.example</groupId><artifactId>cjs-elasticsearch-example</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>cjs-elasticsearch-example</name><description></description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath/>?<!--?lookup?parent?from?repository?--></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><elasticsearch.version>6.4.1</elasticsearch.version><spring.data.elasticsearch.version>3.1.0.RELEASE</spring.data.elasticsearch.version></properties><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>transport-netty4-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>${spring.data.elasticsearch.version}</version></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.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></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>3. application.properties
spring.data.elasticsearch.cluster-name=my-application spring.data.elasticsearch.cluster-nodes=192.168.1.134:9300也許,大家會疑惑,配置文件中明明寫的端口是9200,為何這里配置文件中連接的時候寫的端口是9300呢?
因為,配置9200是通過HTTP連接的端口,9300是TCP連接的端口
?
4. 操作
4.1. 使用Spring Data Elasticsearch Repositories操作Elasticsearch
首先,定義一個實體類
package?com.cjs.example.entity;import?lombok.Data; import?org.springframework.data.annotation.Id; import?org.springframework.data.elasticsearch.annotations.Document;import?java.io.Serializable;@Data @Document(indexName?=?"commodity") public?class?Commodity?implements?Serializable?{@Idprivate?String?skuId;private?String?name;private?String?category;private?Integer?price;private?String?brand;private?Integer?stock;}這里定義了Commodity實例,表示商品。在Elasticsearch 6.X 版本中,不建議使用type,而且在7.X版本中將會徹底廢棄type,所以此處我只指定了indexName,沒有指定type。
這里,一個Commodity代表一個商品,同時代表一條索引記錄。
類比關系型數據庫的話,Index相當于表,Document相當于記錄,然后,需要自己定義一個接口,并繼承ElasticsearchRepository。
package?com.cjs.example.dao;import?com.cjs.example.entity.Commodity; import?org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import?org.springframework.stereotype.Repository;@Repository public?interface?CommodityRepository?extends?ElasticsearchRepository<Commodity,?String>?{}這里的Repository相當于DAO,操作mysql還是elasticsearch都是一樣的
接下來,定義service接口
package?com.cjs.example.service;import?com.cjs.example.entity.Commodity; import?org.springframework.data.domain.Page;import?java.util.List;public?interface?CommodityService?{long?count();Commodity?save(Commodity?commodity);void?delete(Commodity?commodity);Iterable<Commodity>?getAll();List<Commodity>?getByName(String?name);Page<Commodity>?pageQuery(Integer?pageNo,?Integer?pageSize,?String?kw);}實現類
package?com.cjs.example.service.impl;import?com.cjs.example.entity.Commodity; import?com.cjs.example.dao.CommodityRepository; import?com.cjs.example.service.CommodityService; import?org.elasticsearch.index.query.MatchQueryBuilder; import?org.elasticsearch.index.query.QueryBuilders; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.data.domain.Page; import?org.springframework.data.domain.PageRequest; import?org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import?org.springframework.data.elasticsearch.core.query.SearchQuery; import?org.springframework.stereotype.Service;import?java.util.ArrayList; import?java.util.List;@Service public?class?CommodityServiceImpl?implements?CommodityService?{@Autowiredprivate?CommodityRepository?commodityRepository;@Overridepublic?long?count()?{return?commodityRepository.count();}@Overridepublic?Commodity?save(Commodity?commodity)?{return?commodityRepository.save(commodity);}@Overridepublic?void?delete(Commodity?commodity)?{commodityRepository.delete(commodity); //????????commodityRepository.deleteById(commodity.getSkuId());}@Overridepublic?Iterable<Commodity>?getAll()?{return?commodityRepository.findAll();}@Overridepublic?List<Commodity>?getByName(String?name)?{List<Commodity>?list?=?new?ArrayList<>();MatchQueryBuilder?matchQueryBuilder?=?new?MatchQueryBuilder("name",?name);Iterable<Commodity>?iterable?=?commodityRepository.search(matchQueryBuilder);iterable.forEach(e->list.add(e));return?list;}@Overridepublic?Page<Commodity>?pageQuery(Integer?pageNo,?Integer?pageSize,?String?kw)?{SearchQuery?searchQuery?=?new?NativeSearchQueryBuilder().withQuery(QueryBuilders.matchPhraseQuery("name",?kw)).withPageable(PageRequest.of(pageNo,?pageSize)).build();return?commodityRepository.search(searchQuery);}}在這個Service中演示了增刪查改操作,還有分頁查詢
最后,寫一個測試類測試其中的方法
package?com.cjs.example;import?com.cjs.example.entity.Commodity; import?com.cjs.example.service.CommodityService; import?org.junit.Test; import?org.junit.runner.RunWith; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.boot.test.context.SpringBootTest; import?org.springframework.data.domain.Page; import?org.springframework.test.context.junit4.SpringRunner;import?java.util.List;@RunWith(SpringRunner.class) @SpringBootTest public?class?CjsElasticsearchExampleApplicationTests?{@Autowiredprivate?CommodityService?commodityService;@Testpublic?void?contextLoads()?{System.out.println(commodityService.count());}@Testpublic?void?testInsert()?{Commodity?commodity?=?new?Commodity();commodity.setSkuId("1501009001");commodity.setName("原味切片面包(10片裝)");commodity.setCategory("101");commodity.setPrice(880);commodity.setBrand("良品鋪子");commodityService.save(commodity);commodity?=?new?Commodity();commodity.setSkuId("1501009002");commodity.setName("原味切片面包(6片裝)");commodity.setCategory("101");commodity.setPrice(680);commodity.setBrand("良品鋪子");commodityService.save(commodity);commodity?=?new?Commodity();commodity.setSkuId("1501009004");commodity.setName("元氣吐司850g");commodity.setCategory("101");commodity.setPrice(120);commodity.setBrand("百草味");commodityService.save(commodity);}@Testpublic?void?testDelete()?{Commodity?commodity?=?new?Commodity();commodity.setSkuId("1501009002");commodityService.delete(commodity);}@Testpublic?void?testGetAll()?{Iterable<Commodity>?iterable?=?commodityService.getAll();iterable.forEach(e->System.out.println(e.toString()));}@Testpublic?void?testGetByName()?{List<Commodity>?list?=?commodityService.getByName("面包");System.out.println(list);}@Testpublic?void?testPage()?{Page<Commodity>?page?=?commodityService.pageQuery(0,?10,?"切片");System.out.println(page.getTotalPages());System.out.println(page.getNumber());System.out.println(page.getContent());} }以上,便是使用Elasticsearch Repositories的方式
4.2. 使用ElasticsearchTemplate方式操作Elasticsearch
package?com.cjs.example;import?com.cjs.example.entity.Commodity; import?org.elasticsearch.index.query.QueryBuilders; import?org.junit.Test; import?org.junit.runner.RunWith; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.boot.test.context.SpringBootTest; import?org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import?org.springframework.data.elasticsearch.core.query.*; import?org.springframework.test.context.junit4.SpringRunner;import?java.util.List;@RunWith(SpringRunner.class) @SpringBootTest public?class?ElasticsearchTemplateTest?{@Autowiredpublic?ElasticsearchTemplate?elasticsearchTemplate;@Testpublic?void?testInsert()?{Commodity?commodity?=?new?Commodity();commodity.setSkuId("1501009005");commodity.setName("葡萄吐司面包(10片裝)");commodity.setCategory("101");commodity.setPrice(160);commodity.setBrand("良品鋪子");IndexQuery?indexQuery?=?new?IndexQueryBuilder().withObject(commodity).build();elasticsearchTemplate.index(indexQuery);}@Testpublic?void?testQuery()?{SearchQuery?searchQuery?=?new?NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("name",?"吐司")).build();List<Commodity>?list?=?elasticsearchTemplate.queryForList(searchQuery,?Commodity.class);System.out.println(list);}}ElasticsearchTemplate是自動配置的
5. 演示
6. 工程結構
7. 參考
https://docs.spring.io/spring-data/elasticsearch/docs/3.1.0.RELEASE/reference/html/#repositories.query-methods.details
總結
以上是生活随笔為你收集整理的Spring Boot ES 实战,值得参考!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis 的各项功能解决了哪些问题?
- 下一篇: Spring Boot Redis 入门