参考文章:SpringBoot集成elasticsearch支持字段映射

SpringBoot集成elasticsearch支持自动@Field别名存储问题

1、问题描述

Java代码属性字段多使用驼峰命名法,而mysql、elasticsearch等数据存储系统中字段多采用下划线命名法。mysql使用tk.mybatis+@Column注解即可轻松实现Java对象持久化存储字段映射,本文主要解决在elasticsearch集成过程中遇到的问题及如何字段映射

2、集成版本列表

SpringCloud、SpringBoot、elasticsearch版本依赖度很高,这也是这次集成遇到的大问题,且elasticsearch在3.2以后版本才引入了@Field的name属性,因此将此次的集成版本列出如下:

项目版本
SpringBoot2.2.13.RELEASE
elasticsearch7.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);
        }
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐