SpringBoot 操作 ElasticSearch
开发环境:
- Elasticsearch-7.6.2
- SpringBoot-2.3.2.RELEASE
- Elasticsearch-head-5.0.0
一、ElasticSearch 简介
1、简介
ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多员工能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
ElasticSearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
2、特性
- 分布式的文档存储引擎
- 分布式的搜索引擎和分析引擎
- 分布式,支持PB级数据
3、使用场景
- 搜索领域: 如百度、谷歌,全文检索等。
- 门户网站: 访问统计、文章点赞、留言评论等。
- 广告推广: 记录员工行为数据、消费趋势、员工群体进行定制推广等。
- 信息采集: 记录应用的埋点数据、访问日志数据等,方便大数据进行分析。
二、SpringBoot 项目引入 ElasticSearch
1、创建 elasticsearch 项目
2、修改依赖配置
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3、修改配置文件
server:
port: 9001
spring:
application:
name: elasticsearch
data:
elasticsearch:
cluster-name: elasticsearch #查看localhost:9200测试端口的返回值
cluster-nodes: localhost:9300
9200用于外部通讯,基于http协议,程序与es的通信使用9200端口。
9300jar之间就是通过tcp协议通信,遵循tcp协议,es集群中的节点之间也通过9300端口进行通信。
4、创建 Commodity 商品实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
* @author : CP
* @version: 1.0
* @program : elasticsearch
* @description :
* @date : 2021-03-17 12:28
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "commoditydb") //indexName = 不能包含大写
public class Commodity implements Serializable {
/**
* 商品id
*/
@Id
private String skuId;
/**
* 商品名称
*/
private String name;
/**
* 商品图片路径
*/
private String imgUrl;
/**
* 商品价格
*/
private String price;
/**
* 商品品牌
*/
private String brand;
/**
* 商品路径
*/
private String commodityUrl;
}
5、创建 CommodityRepository 类
继承 ElasticsearchRepository 操作类似 Mybatis-plus
package com.cp.dao;
import com.cp.enitiy.Commodity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
/**
* @author : CP
* @version: 1.0
* @program : elasticsearch
* @description :
* @date : 2021-03-17 12:38
**/
@Repository
public interface CommodityRepository extends ElasticsearchRepository<Commodity, String> {
}
6、定义service层
package com.cp.service;
import com.cp.enitiy.Commodity;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* @author : CP
* @version: 1.0
* @program : elasticsearch
* @description :
* @date : 2021-03-17 13:33
**/
public interface CommodityService {
/**
* 获取总记录数
* @return long
*/
long count();
/**
* 新增
* @param commodity 商品类
* @return Commodity
*/
Commodity save(Commodity commodity);
/**
* 删除指定内容
* @param commodity
*/
void delete(Commodity commodity);
/**
* 获取所有
* @return Iterable 迭代器
*/
Iterable<Commodity> getAll();
/**
* 根据名称模糊获取所有内容
* @param name 查询条件
* @return List<Commodity>
*/
List<Commodity> getByName(String name);
/**
* 查询并分页
* @param pageNo 当前页码
* @param pageSize 显示行数
* @param kw 查询条件
* @return Page<Commodity>
*/
Page<Commodity> pageQuery(Integer pageNo, Integer pageSize, String kw);
}
package com.cp.service.impl;
import com.cp.dao.CommodityRepository;
import com.cp.enitiy.Commodity;
import com.cp.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.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author : CP
* @version: 1.0
* @program : elasticsearch
* @description :
* @date : 2021-03-17 13:34
**/
@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);
}
@Override
public Iterable<Commodity> getAll() {
return commodityRepository.findAll();
}
@Override
public List<Commodity> getByName(String name) {
//商品集合
List<Commodity> list = new ArrayList<>();
//定义查询条件
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
//根据条件进行搜索
Iterable<Commodity> search = commodityRepository.search(matchQueryBuilder);
//迭代储存数据
search.forEach(i->list.add(i));
return list;
}
@Override
public Page<Commodity> pageQuery(Integer pageNo, Integer pageSize, String kw) {
NativeSearchQuery serchQuery = new NativeSearchQueryBuilder()
//定义查询方式
.withQuery(QueryBuilders.matchPhraseQuery("name", kw))
//进行分页
.withPageable(PageRequest.of(