栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot集成elasticsearch支持字段映射(驼峰转下划线)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot集成elasticsearch支持字段映射(驼峰转下划线)

参考文章: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;


@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;


@Component
public interface FiendSkillRepo extends ElasticsearchRepository {
}
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;


@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);
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号