本文主要介绍了Spring-Data-elastic search @ field无效标注的完美解决方案,具有很好的参考价值。希望对你有帮助。如有错误或不足之处,请不吝赐教。
前言
我看了很多博客和资料,大部分都是关于这个spring bug的,然后通过一个. json配置文件加载它。我也真的笑了。本来标注是为了方便开发,取消配置文件的功能,结果解决方案本末倒置。这里我提供最正确的解决方案。
一. 准备实例代码
这是实体类代码及其注释。
包com . gupao . spring boot demo . bean;
进口龙目岛。数据;
导入org . spring framework . data . annotation . id;
导入org . spring framework . data . elastic search . annotations . document;
导入org . spring framework . data . elastic search . annotations . field;
导入org . spring framework . data . elastic search . annotations . field type;
导入Java . util . list;
/**
*功能描述:专家系统的用户
*
* @作者:周舟
* @ Date:2020/7/309:57
*/
@数据
@Document(indexName='es_user ')
公共类ESUser {
@Id
私有长id;
@Field(type=FieldType。正文)
私有字符串名称;
@Field(type=FieldType。整数)
私有整数年龄;
@Field(type=FieldType。关键词)
私有ListString标记;
@Field(type=FieldType。Text,analyzer='ik_max_word ')
私弦desc;
}
这是创建索引的代码。
boolean index=elasticsearchresttemplate . create index(esuser . class);
我们会发现,执行之后,虽然执行成功了,但是当我们查看索引信息的时候,却发现没有映射信息。
二. 解决方案
1.在createIndex方法后加putMapping方法
boolean index=elasticsearchresttemplate . create index(esuser . class);
elasticsearchresttemplate . put mapping(esuser . class);
要解决该问题,请检查映射信息。
2.更新版本(注: 版本更新对应要更新es版本到7.8以上,不建议!!)
项目启动时,索引是自动创建的,无需手动调用API创建!
三. 解决思路(源码部分,以下只是笔者解决过程)
我是看了elasticsearcRestTemplate的源代码才知道的。
@覆盖
public ElasticsearchPersistentEntity getpersistententity for(Class clazz){
assert . is true(clazz . isanotationpresent(document . class),'无法识别索引名称。'clazz.getSimpleName()
不是文档。请确保document类用@Document(indexName='foo ')”进行了批注;
返回elasticsearchconverter . getmappingcontext()。getRequiredPersistentEntity(clazz);
}
在创建索引之前,会通过getMappingContext方法获取mappingContext字段,但是这个字段怎么赋值呢?
没有头绪!!!!!
转念一想,还是直接想吧。我们发现@Field字段在哪里被解析,所以我们知道如何读取@Field的类并设置mappingContext!
精彩!
原来是
MappingBuilder是一个解析@Field的类。后来进去的时候发现@ mappingparsing.json,就是在线的方法解析方法也在里面。哈哈,殊途同归。外部方法有:
看看评论,就知道离真相不远了。继续查通话链,真相大白!下面的方法我就不解释了。
就是这个putMapping方法。我找了你很久了!
以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。