版本说明:
- springboot 2.7.x → spring data es 4.4.x → es 7.17.x,客户端:
resthighlevelclient(已废弃) - springboot 3.x → spring data es 5.x → es 8.x,客户端:新官方 java api client(推荐)
- 三种开发方式:
elasticsearchrepository:简单 crud,类似 mybatis-repository,适合简单业务elasticsearchoperations(新版替代 elasticsearchresttemplate):复杂 dsl、分页、高亮、聚合,企业最常用- 原生
elasticsearchclient:完全原生官方客户端,自由度最高
一、前置准备
- 部署 elasticsearch(单机 / 集群),es 8 默认开启 https + 账号认证,开发可临时关闭安全
- 中文检索建议安装 ik 分词器(版本必须和 es 完全一致)
- 确保 springboot、spring data es、es 服务端 版本兼容(版本不匹配是最常见报错)
二、maven 依赖(springboot3 + es8 推荐)
<!-- spring data elasticsearch 自动引入新版java api client -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-elasticsearch</artifactid>
</dependency>
<!-- lombok 可选,简化实体类 -->
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>springboot2.7 + es7 旧项目:同样使用 starter,底层自动使用 resthighlevelclient(不再推荐新项目使用)
三、application.yml 配置
spring:
elasticsearch:
uris: http://127.0.0.1:9200 #集群多个节点逗号分隔
# es开启认证时配置账号密码
# username: elastic
# password: elastic
connection-timeout: 10s
socket-timeout: 30s
# 调试:打印es请求dsl
logging:
level:
org.springframework.data.elasticsearch: debug四、定义 es 实体(document 映射索引)
import lombok.data;
import org.springframework.data.elasticsearch.annotations.document;
import org.springframework.data.elasticsearch.annotations.field;
import org.springframework.data.elasticsearch.annotations.fieldtype;
@data
// indexname:索引名(小写,不能大写)createindex=true项目启动自动创建索引
@document(indexname = "product", createindex = true)
public class productdoc {
// @id 对应es文档 _id
@id
private long id;
// text:分词,全文检索;ik_max_word 细粒度分词,ik_smart粗粒度
@field(type = fieldtype.text, analyzer = "ik_max_word", searchanalyzer = "ik_smart")
private string name;
// keyword:不分词,精确匹配、筛选、聚合
@field(type = fieldtype.keyword)
private string category;
@field(type = fieldtype.double)
private double price;
@field(type = fieldtype.text, analyzer = "ik_max_word")
private string desc;
}注解说明:
@document:标记实体为 es 文档@id:文档唯一 idfieldtype.text:分词检索;fieldtype.keyword:精确匹配
方式 1:elasticsearchrepository(简单 crud)
1. 创建 repository 接口
import org.springframework.data.elasticsearch.repository.elasticsearchrepository;
// 泛型:实体类,主键类型
public interface productrepository extends elasticsearchrepository<productdoc, long> {
// 【方法名自动推导查询】根据名称分词查询
list<productdoc> findbyname(string name);
// 自定义dsl语句查询
// @query("{\"match\": {\"name\": \"?0\"}}")
// list<productdoc> searchname(string keyword);
}2. 使用示例
@service
@requiredargsconstructor
public class productservice {
private final productrepository productrepository;
// 新增/全量更新(id存在则覆盖,不存在新增)
public void save(productdoc doc) {
productrepository.save(doc);
}
// 根据id查询
public optional<productdoc> findbyid(long id) {
return productrepository.findbyid(id);
}
// 删除
public void delete(long id) {
productrepository.deletebyid(id);
}
// 分页
public page<productdoc> page(string keyword, int page, int size) {
pageable pageable = pagerequest.of(page, size);
return productrepository.findbyname(keyword, pageable);
}
}✅ 优点:代码极简;❌ 缺点:复杂 bool 组合、高亮、聚合不好实现
方式 2:elasticsearchoperations(推荐,复杂查询)
spring data es5.x 推荐注入 elasticsearchoperations(替代旧版 elasticsearchresttemplate),支持构建原生 dsl、分页、排序、高亮、聚合spring
@service
@requiredargsconstructor
public class productesservice {
private final elasticsearchoperations esoperations;
// 1. 新增文档
public productdoc savedoc(productdoc doc) {
return esoperations.save(doc);
}
// 2. 根据id查询
public productdoc getbyid(long id) {
return esoperations.get(string.valueof(id), productdoc.class);
}
// 3. 删除文档
public void deletedoc(long id) {
esoperations.delete(string.valueof(id), productdoc.class);
}
// 4. 复杂组合查询:关键词检索 + 分类筛选 + 价格区间 + 分页 + 高亮
public searchhits<productdoc> search(string keyword, string category, double minprice, int pagenum, int pagesize) {
// 构建bool查询
boolquery boolquery = boolquery.builder()
// must:必须匹配(分词检索商品名)
.must(m -> m.match(ma -> ma.field("name").query(keyword)))
// filter:过滤,不计算相关度
.filter(f -> f.term(t -> t.field("category").value(category)))
.filter(f -> f.range(r -> r.field("price").gte(jsondata.of(minprice))))
.build();
// 高亮配置
highlightoptions highlight = highlightoptions.builder()
.field("name", h -> h.pretags("<em>").posttags("</em>"))
.build();
nativesearchquery searchquery = nativesearchquerybuilder()
.withquery(boolquery)
.withhighlightoptions(highlight)
.withpageable(pagerequest.of(pagenum, pagesize)) // page从0开始
.withsort(sort.by(sort.direction.desc, "price"))
.build();
// 执行查询
return esoperations.search(searchquery, productdoc.class);
}
}方式 3:原生 elasticsearchclient(官方底层客户端,极致灵活)
适合聚合、向量检索、es 新特性,完全对齐官方 dsl,强类型编译校验csdn博...
@service
@requiredargsconstructor
public class productnativeservice {
private final elasticsearchclient esclient;
// 新增文档
public void insert(productdoc doc) throws ioexception {
esclient.index(i -> i
.index("product")
.id(doc.getid().tostring())
.document(doc)
);
}
// match分词查询
public searchresponse<productdoc> search(string keyword) throws ioexception {
return esclient.search(s -> s
.index("product")
.query(q -> q.match(m -> m.field("name").query(keyword))),
productdoc.class
);
}
}五、常用高级操作
1. 索引管理(创建 / 删除索引)
// 注入 elasticsearchoperations
indexoperations indexops = esoperations.indexops(productdoc.class);
// 判断索引是否存在
boolean exist = indexops.exists();
// 删除索引
if(exist){
indexops.delete();
}
// 创建索引+自动映射mapping
indexops.create();
indexops.putmapping();2. 批量导入(bulk 批量插入,大数据必用)
list<productdoc> list = new arraylist<>(); // 封装多条数据 esoperations.save(list);
3. 高亮结果解析
search 返回 searchhits<productdoc>,遍历 searchhit 获取 gethighlightfields() 替换原始文本
六、常见踩坑总结
- 版本不匹配:90% 报错来源,严格对齐 springboot → spring data es → es 服务端版本
- 索引名不能大写,es 底层全小写
- text 字段用于分词搜索,keyword 用于筛选、分组、精确匹配,不要混用
- es8 默认开启 ssl 和账号认证,开发环境关闭安全,生产务必开启
- 深分页(from+size 超过 10000)会报错,需使用
scroll滚动分页 /search_after - 数据库和 es 数据一致性:通过 mq 双写、binlog 同步(canal)保证最终一致性,不要依赖事务
- ik 分词器版本必须和 es 版本一致,否则 es 启动失败
以上就是springboot接入elasticsearch完整教程的详细内容,更多关于springboot接入elasticsearch的资料请关注代码网其它相关文章!
发表评论