当前位置: 代码网 > it编程>编程语言>Java > SpringBoot接入Elasticsearch完整教程

SpringBoot接入Elasticsearch完整教程

2026年08月26日 Java 我要评论
版本说明:springboot 2.7.x → spring data es 4.4.x → es 7.17.x,客户端:resthighlevelclient(已废弃)sprin

版本说明:

  • 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(推荐)
  • 三种开发方式:
    1. elasticsearchrepository:简单 crud,类似 mybatis-repository,适合简单业务
    2. elasticsearchoperations(新版替代 elasticsearchresttemplate):复杂 dsl、分页、高亮、聚合,企业最常用
    3. 原生 elasticsearchclient:完全原生官方客户端,自由度最高

一、前置准备

  1. 部署 elasticsearch(单机 / 集群),es 8 默认开启 https + 账号认证,开发可临时关闭安全
  2. 中文检索建议安装 ik 分词器(版本必须和 es 完全一致)
  3. 确保 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:文档唯一 id
  • fieldtype.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() 替换原始文本

六、常见踩坑总结

  1. 版本不匹配:90% 报错来源,严格对齐 springboot → spring data es → es 服务端版本
  2. 索引名不能大写,es 底层全小写
  3. text 字段用于分词搜索,keyword 用于筛选、分组、精确匹配,不要混用
  4. es8 默认开启 ssl 和账号认证,开发环境关闭安全,生产务必开启
  5. 深分页(from+size 超过 10000)会报错,需使用 scroll 滚动分页 /search_after
  6. 数据库和 es 数据一致性:通过 mq 双写、binlog 同步(canal)保证最终一致性,不要依赖事务
  7. ik 分词器版本必须和 es 版本一致,否则 es 启动失败

以上就是springboot接入elasticsearch完整教程的详细内容,更多关于springboot接入elasticsearch的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com