一、核心概念:ES 中的 “索引” 与 “实体映射”
在 Elasticsearch 中,数据以 “文档” 形式存储在 “索引” 中(类似 MySQL 中 “表” 与 “行” 的关系)。Java 中操作 ES 时,需通过实体类映射 ES 索引的结构,明确字段类型、分词规则等元信息。
二、步骤 1:定义映射实体类(核心)
实体类是 Java 对象与 ES 文档的 “桥梁”,通过注解指定索引名、字段类型、分词规则等。
@Data // Lombok 注解,自动生成 getter/setter/toString 等方法
@Document(indexName = "albuminfo") // 核心注解:指定映射的 ES 索引名(类似 MySQL 表名)
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略 JSON 中实体类未定义的字段,避免反序列化报错
public class AlbumInfoIndex implements Serializable { // 实现 Serializable 方便序列化传输
private static final long serialVersionUID = 1L; // 序列化版本号,确保序列化一致性
@Id // 标记该字段作为 ES 文档的 _id(类似 MySQL 主键)
private Long id;
@Field(
type = FieldType.Text, // 字段类型为 Text:支持分词,适合全文检索
analyzer = "ik_max_word" // 指定分词器
)
private String albumTitle;
}
关键注解说明:
-
@Document(indexName = "albuminfo"):必须注解,指定该实体类映射到 ES 的索引名称(索引名建议小写,多个单词用下划线分隔)。若索引不存在,ES 会在首次插入数据时自动创建该索引。
-
@Id:标记实体类的某个字段作为 ES 文档的
_id(文档唯一标识),通常对应业务主键(如这里的专辑 ID)。 -
@Field:用于配置字段的 ES 属性:
-
type = FieldType.Text:Text 类型支持分词,适合存储需要全文检索的内容(如标题、描述);(对比:FieldType.Keyword不分词,适合存储精确匹配的内容,如手机号、状态码)
-
analyzer = "ik_max_word"中文分词器,提升检索时的匹配精度。
-
-
@JsonIgnoreProperties(ignoreUnknown = true):当 JSON 数据(如从 ES 查询返回的结果)中包含实体类未定义的字段时,忽略这些字段,避免抛出 “未知字段” 的反序列化异常。
三、步骤 2:配置 ES 连接信息
通过 Spring 配置文件指定 ES 服务地址,让项目能连接到 ES 集群。
spring:
elasticsearch:
uris: http://192.168.xxx.xxxx:9200
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
# 可选:若项目暂不使用数据库,排除数据源自动配置,避免启动报错
四、步骤 3:定义 Repository 接口(操作 ES 的 “入口”)
通过继承 Spring Data 提供的 CrudRepository 接口,快速获得对 ES 索引的基本操作能力(无需手动写实现)。
@Repository // 标记为数据访问层组件,被 Spring 管理
// 泛型说明:<实体类类型, 主键类型>,这里对应 AlbumInfoIndex 实体,主键类型为 Long
public interface AlbumInfoRepository extends CrudRepository<AlbumInfoIndex, Long> {
}

被折叠的 条评论
为什么被折叠?



