日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot ES 实战,值得参考!

發布時間:2025/3/21 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=262144

1.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 实战,值得参考!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。