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這個方法啊,找瞭你好久!!!!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot集成ElasticSearch的示例代碼
- Spring Boot 集成Elasticsearch模塊實現簡單查詢功能
- Elasticsearch中store field與non-store field的區別說明
- SpringBoot框架集成ElasticSearch實現過程示例詳解
- 關於註解式的分佈式Elasticsearch的封裝案例