spring-data-elasticsearch @Field注解无效的完美解决方案

 更新时间:2021年07月26日 16:03:32   作者:晴天小哥哥  
这篇文章主要介绍了spring-data-elasticsearch @Field注解无效的完美解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言

我看了一大堆博客和资料大多是说这个spring的bug, 然后通过一个.json的配置文件去加载,我也是真的笑了, 本来注解就是方便开发,取消配置文件的功能, 结果解决方案却是本末倒置, 这里我奉献出最正确的解决方案

一. 准备实例代码

这是实体类代码,及其注解

package com.gupao.springbootdemo.bean; 
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType; 
import java.util.List;
 
/**
 * 功能描述:ES的用户
 *
 * @Author: zhouzhou
 * @Date: 2020/7/30$ 9:57$
 */
@Data
@Document(indexName = "es_user")
public class ESUser {
 
    @Id
    private Long id;
    @Field(type = FieldType.Text)
    private String name;
    @Field(type = FieldType.Integer)
    private Integer age;
    @Field(type = FieldType.Keyword)
    private List<String> tags;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String desc;  
}

这是创建索引的代码

boolean index = elasticsearchRestTemplate.createIndex(ESUser.class);

我们会发现,当执行后, 虽然执行成功, 但是我们去查看索引信息的时候发现没有mapping信息

二. 解决方案

1.在createIndex方法后加putMapping方法

boolean index = elasticsearchRestTemplate.createIndex(ESUser.class);
elasticsearchRestTemplate.putMapping(ESUser.class);

问题解决,查看mapping信息就有了

2.更新版本(注: 版本更新对应要更新es版本到7.8以上,不建议!!)

项目启动的时候,自动创建索引,无需手动调用API创建!!!

三. 解决思路(源码部分,以下只是笔者解决过程)

笔者通过查看elasticsearcRestTemplate的源码才发现

@Override
	public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) {
		Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName()
				+ " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")");
		return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz);
	}

创建索引前会通过getMappingContext方法获取mappingContext字段, 但是这个字段怎么赋值呢?

没有头绪!!!!!

笔者又转念一想, 我们直接思考下, 我们找到@Field字段在哪里被解析, 这不就知道读取@Field的类和设置mappingContext的方法了!!!!

妙 啊!!!!!!

原来是

MappingBuilder这个类对@Field进行解析, 后来进去发现@Mapping解析.json,也就是网上的方法解析方法也在里面, 哈哈殊途同归, 对外提供的方法为:

看注释, 我就知道离真相不远了,继续查看调用链, 真相大白!!!下面方法我就不多做解释了

原来是这个putMapping这个方法啊,找了你好久!!!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring AOP与AspectJ的对比及应用详解

    Spring AOP与AspectJ的对比及应用详解

    这篇文章主要为大家介绍了Spring AOP与AspectJ的对比及应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 软件开发基础之设计模式概述

    软件开发基础之设计模式概述

    这篇文章介绍了软件开发基础之设计模式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 浅谈java实现mongoDB的多条件查询

    浅谈java实现mongoDB的多条件查询

    这篇文章主要介绍了java实现mongoDB的多条件查询,具有一定参考价值,需要的朋友可以参考下。
    2017-09-09
  • Spring框架基于AOP实现简单日志管理步骤解析

    Spring框架基于AOP实现简单日志管理步骤解析

    这篇文章主要介绍了Spring框架基于AOP实现简单日志管理步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • PostMan传@RequestParam修饰的数组方式

    PostMan传@RequestParam修饰的数组方式

    这篇文章主要介绍了PostMan传@RequestParam修饰的数组方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Centos中安装jdk案例讲解

    Centos中安装jdk案例讲解

    这篇文章主要介绍了Centos中安装jdk案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring AOP失效的常见场景分析

    Spring AOP失效的常见场景分析

    Spring的AOP(面向切面编程)是一种强大的技术,用于在应用程序中实现横切关注点的模块化,虽然Spring的AOP在大多数情况下都是有效的,但在某些场景下可能会失效,下面来分析Spring AOP失效的常见场景,需要的朋友可以参考下
    2024-01-01
  • java中计算字符串长度的方法及u4E00与u9FBB的认识

    java中计算字符串长度的方法及u4E00与u9FBB的认识

    字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围“\u4E00” 到“\u9FBB”之间感兴趣的朋友可以参考本文,或许对你有所帮助
    2013-01-01
  • Java 8 Stream.distinct() 列表去重的操作

    Java 8 Stream.distinct() 列表去重的操作

    这篇文章主要介绍了Java 8 Stream.distinct() 列表去重的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 使用filter实现url级别内存缓存示例

    使用filter实现url级别内存缓存示例

    这篇文章主要介绍了使用filter实现url级别内存缓存示例,只需要一个静态类,在filter中调用,也可以全部写到filt里面。可以根据查询参数分别缓存,需要的朋友可以参考下
    2014-03-03

最新评论