博客
关于我
Spring Boot & ES 实战,值得参考!
阅读量:433 次
发布时间:2019-03-06

本文共 7299 字,大约阅读时间需要 24 分钟。

Spring Boot 与 Elasticsearch 的集成指南

前言

本文将详细介绍如何在 Spring Boot 项目中集成 Elasticsearch,并通过实际代码示例展示两种主要的操作方式:Spring Data Elasticsearch Repositories 和 Elasticsearch Template。

环境与配置

在开始操作之前,需要确保以下几点:

  • 服务端:使用 Elasticsearch 6.3.2
  • 客户端:使用 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

版本兼容性

Spring Boot 2.0.5 默认的 Elasticsearch 版本较低,本文将使用最新版本 6.4.1。同时,确保 spring-data-elasticsearch 的版本升级到 3.1.0,以避免类似 NoClassDefFoundError 的问题。

依赖管理

在项目的 pom.xml 中,添加以下依赖项:

org.elasticsearch
elasticsearch
${elasticsearch.version}
org.elasticsearch.client
transport
${elasticsearch.version}
org.elasticsearch.client
elasticsearch-rest-client
${elasticsearch.version}
org.elasticsearch.plugin
transport-netty4-client
${elasticsearch.version}
org.springframework.data
spring-data-elasticsearch
${spring.data.elasticsearch.version}
org.springframework.boot
spring-boot-starter-data-elasticsearch

application.properties 配置

application.properties 中添加以下配置:

spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=192.168.1.134:9300

注意事项:配置文件中 9200 是通过 HTTP 端口定义的,而 9300 是通过 TCP 端口定义的,两者均为 Elasticsearch 的常用端口。

操作指南

使用 Spring Data Elasticsearch Repositories 操作 Elasticsearch

实体类定义

定义一个用于存储商品信息的实体类:

@Data
@Document(indexName = "commodity")
public class Commodity implements Serializable {
@Id
private String skuId;
private String name;
private String category;
private Integer price;
private String brand;
private Integer stock;
}

Repository 接口

创建一个 DAO 接口,继承 ElasticsearchRepository

@Repository
public interface CommodityRepository extends ElasticsearchRepository {
}

Service 接口

定义一个服务接口,包含 CRUD 和查询操作:

public interface CommodityService {
long count();
Commodity save(Commodity commodity);
void delete(Commodity commodity);
Iterable
getAll();
List
getByName(String name);
Page
pageQuery(Integer pageNo, Integer pageSize, String kw);
}

实现类

实现上述接口的具体类:

@Service
public class CommodityServiceImpl implements CommodityService {
@Autowired
private CommodityRepository commodityRepository;
@Override
public long count() {
return commodityRepository.count();
}
@Override
public Commodity save(Commodity commodity) {
return commodityRepository.save(commodity);
}
@Override
public void delete(Commodity commodity) {
commodityRepository.delete(commodity);
commodityRepository.deleteById(commodity.getSkuId());
}
@Override
public Iterable
getAll() {
return commodityRepository.findAll();
}
@Override
public List
getByName(String name) {
List
list = new ArrayList<>();
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
Iterable
iterable = commodityRepository.search(matchQueryBuilder);
iterable.forEach(e -> list.add(e));
return list;
}
@Override
public Page
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);
}
}

测试类

创建测试类,验证各项功能:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CjsElasticsearchExampleApplicationTests {
@Autowired
private CommodityService commodityService;
@Test
public void contextLoads() {
System.out.println(commodityService.count());
}
@Test
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);
}
@Test
public void testDelete() {
Commodity commodity = new Commodity();
commodity.setSkuId("1501009002");
commodityService.delete(commodity);
}
@Test
public void testGetAll() {
Iterable
iterable = commodityService.getAll();
iterable.forEach(e -> System.out.println(e.toString()));
}
@Test
public void testGetByName() {
List
list = commodityService.getByName("面包");
System.out.println(list);
}
@Test
public void testPage() {
Page
page = commodityService.pageQuery(0, 10, "切片");
System.out.println(page.getTotalPages());
System.out.println(page.getNumber());
System.out.println(page.getContent());
}
}

使用 Elasticsearch Template 操作 Elasticsearch

测试类

创建一个测试类,使用 Elasticsearch Template 进行操作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticsearchTemplateTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
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);
}
@Test
public void testQuery() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("name", "吐司"))
.build();
List
list = elasticsearchTemplate.queryForList(searchQuery, Commodity.class);
System.out.println(list);
}
}

工程结构

项目目录结构

src/
├── main/
│ ├── java/
│ │ ├── com/
│ │ │ └── cjs/
│ │ │ ├── example/
│ │ │ │ ├── entity/
│ │ │ │ └── dao/
│ │ │ └── service/
│ │ └── impl/
│ └── resources/
│ └── application.properties

参考资料

你可能感兴趣的文章
nginx 配置 单页面应用的解决方案
查看>>
nginx 配置https(一)—— 自签名证书
查看>>
nginx 配置~~~本身就是一个静态资源的服务器
查看>>
Nginx 配置清单(一篇够用)
查看>>
Nginx 配置解析:从基础到高级应用指南
查看>>
nginx+php的搭建
查看>>
nginx+tomcat+memcached
查看>>
nginx+Tomcat性能监控
查看>>
nginx+uwsgi+django
查看>>
Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
查看>>
Nginx下配置codeigniter框架方法
查看>>
Nginx之二:nginx.conf简单配置(参数详解)
查看>>
Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
查看>>
Nginx代理初探
查看>>
Nginx代理外网映射
查看>>
Nginx代理模式下 log-format 获取客户端真实IP
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
查看>>