SpringBoot集成elasticsearch支持字段映射(驼峰转下划线)
参考文章:SpringBoot集成elasticsearch支持字段映射SpringBoot集成elasticsearch支持自动@Field别名存储问题1、问题描述Java代码属性字段多使用驼峰命名法,而mysql、elasticsearch等数据存储系统中字段多采用下划线命名法。mysql使用tk.mybatis+@Column注解即可轻松实现Java对象持久化存储字段映射,本文主要解决在el
参考文章:SpringBoot集成elasticsearch支持字段映射
SpringBoot集成elasticsearch支持自动@Field别名存储问题
1、问题描述
Java代码属性字段多使用驼峰命名法,而mysql、elasticsearch等数据存储系统中字段多采用下划线命名法。mysql使用tk.mybatis+@Column注解即可轻松实现Java对象持久化存储字段映射,本文主要解决在elasticsearch集成过程中遇到的问题及如何字段映射
2、集成版本列表
SpringCloud、SpringBoot、elasticsearch版本依赖度很高,这也是这次集成遇到的大问题,且elasticsearch在3.2以后版本才引入了@Field的name属性,因此将此次的集成版本列出如下:
项目 | 版本 |
---|---|
SpringBoot | 2.2.13.RELEASE |
elasticsearch | 7.15.2 |
3、启动yml文件配置
spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-name: "es-bigdata"
cluster-nodes: xx.xx.xx.xx:9300,xx.xx.xx.xx:9300,xx.xx.xx.xx:9300
4、Java持久化对象定义(Entity定义)
主要要添加 @Field(name = "xxx")这个注解,添加@JsonProperty注解是为了向前端返回结果时,由驼峰转换为下划线的形式。
package org.fiend.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* @author langpf 2021-11-18
*/
@Document(indexName = "fiend_kill")
public class FiendKillEntity {
@Id
@Field(name = "kill_id")
@JsonProperty("kill_id")
private String killId;
@Field(name = "kill_name")
@JsonProperty("kill_name")
private String killName;
public String getKillId() {
return killId;
}
public void setKillId(String killId) {
this.killId = killId;
}
public String getKillName() {
return killName;
}
public void setKillName(String killName) {
this.killName = killName;
}
}
5、Repository定义
package org.fiend.repository;
import org.fiend.entity.FiendKillEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
/**
* @author langpf 2021-11-18
*/
@Component
public interface FiendSkillRepo extends ElasticsearchRepository<FiendKillEntity, Long> {
}
6、重新定义ElasticsearchTemplate
ElasticsearchTemplate初始化时,持久化了一个ResultsMapper对象,该对象中的EntityMapper负责对象数据的json化等工作,而EntityMapper实现有两,DefaultEntityMapper和ElasticsearchEntityMapper(从3.2版本后引入),而平台初始化默认用的是DefaultEntityMapper实现。elasticsearch版本从3.2以后版本才加入了@Field的name属性,引入自带的字段别名映射能力,而ElasticsearchEntityMapper正是用于解决该问题,因此,需要自定义注入ElasticsearchTemplate的bean对象。
package org.fiend.configure;
import org.elasticsearch.client.Client;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
/**
* @author uf801862 2021-11-22 10:57:14
* <p>
* ElasticsearchTemplate初始化时,持久化了一个ResultsMapper对象,
* 该对象中的EntityMapper负责对象数据的json化等工作,
* 而EntityMapper实现有两,
* DefaultEntityMapper和ElasticsearchEntityMapper(从3.2版本后引入),
* 而平台初始化默认用的是DefaultEntityMapper实现。
* elasticsearch版本从3.2以后版本才加入了@Field的name属性,引入自带的字段别名映射能力,
* 而ElasticsearchEntityMapper正是用于解决该问题,因此,需要自定义注入ElasticsearchTemplate的bean对象
*/
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchTemplate elasticsearchTemplate(Client client, ElasticsearchConverter converter) {
try {
return new ElasticsearchTemplate(client,
new ElasticsearchEntityMapper(converter.getMappingContext(), null));
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
}
更多推荐
所有评论(0)