Spring Boot & ES 实战,值得参考!
发布日期:2021-06-30 12:38:29
浏览次数:2
分类:技术文章
本文共 10600 字,大约阅读时间需要 35 分钟。
作者:废物大师兄
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. 依赖
<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; public class Commodity implements Serializable { private 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; public class CommodityServiceImpl implements CommodityService { private CommodityRepository commodityRepository; public long count() { return commodityRepository.count(); } public Commodity save(Commodity commodity) { return commodityRepository.save(commodity); } public void delete(Commodity commodity) { commodityRepository.delete(commodity); // commodityRepository.deleteById(commodity.getSkuId()); } public Iterable<Commodity> getAll() { return commodityRepository.findAll(); } public 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; } public 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; (SpringRunner.class) public class CjsElasticsearchExampleApplicationTests { private CommodityService commodityService; public void contextLoads() { System.out.println(commodityService.count()); } public 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); } public void testDelete() { Commodity commodity = new Commodity(); commodity.setSkuId( "1501009002"); commodityService.delete(commodity); } public void testGetAll() { Iterable<Commodity> iterable = commodityService.getAll(); iterable.forEach(e->System.out.println(e.toString())); } public void testGetByName() { List<Commodity> list = commodityService.getByName( "面包"); System.out.println(list); } public 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; (SpringRunner.class) public class ElasticsearchTemplateTest { public ElasticsearchTemplate elasticsearchTemplate; public 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); } public 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
- END -
关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 最新技术干货。
最近干货分享
点击「阅读原文」加入栈长的战队~
转载地址:https://javastack.blog.csdn.net/article/details/100788552 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月27日 23时40分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一份来自掘金社区的开发者报告
2019-05-01
只有1%的程序员搞懂过浮点数陷阱
2019-05-01
Erlang 之父 Joe Armstrong 去世
2019-05-01
速来,上期中奖名单
2019-05-01
一名 Google 工程师的大数据处理经验
2019-05-01
30分钟学会pyecharts数据可视化
2019-05-01
从一个骗子身上学到的
2019-05-01
关于Python爬虫,这里有一条高效的学习路径
2019-05-01
Python学习指南,看这篇清晰多了!
2019-05-01
Oracle裁员,3点建议
2019-05-01
「忙」只是借口
2019-05-01
如果只有1小时学Python,看这篇就够了
2019-05-01
命名难,难于上青天
2019-05-01
记一件小事
2019-05-01
掌握 Python 爬虫的所有技巧,都在这里!
2019-05-01
史上最烂项目:苦撑12年,600多万行代码...
2019-05-01
把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
2019-05-01
斯坦福后空翻机器人设计、代码全开源,成本降至3000美元,人人皆可DIY
2019-05-01
618|Python购书攻略
2019-05-01
请停止学习框架
2019-05-01