1. 程式人生 > 程式設計 >spring-data-elasticsearch @Field註解無效的完美解決方案

spring-data-elasticsearch @Field註解無效的完美解決方案

前言

我看了一大堆部落格和資料大多是說這個spring的bug, 然後通過一個.on的配置檔案去載入,我也是真的笑了, 本來註解就是方便開發,取消配置檔案的功能, 結果解決方案卻是本末倒置, 這裡我奉獻出最正確的解決方案

一. 準備例項程式碼

這是實體類程式碼,及其註解

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 .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資訊就有了

spring-data-elasticsearch @Field註解無效的完美解決方案

2.更新版本(注: 版本更新對應要更新es版本到7.8以上,不建議!!)

spring-data-elasticsearch @Field註解無效的完美解決方案

專案啟動的時候,自動建立索引,無需手動呼叫API建立!!!

三. 解決思路(原始碼部分,以下只是筆者解決過程)

筆者通過檢視elasticsearcRestTemplate的原始碼才發現

@Override
	public ElasticsearchPersistentElBwNPLntity getPersistentEntityFor(Class clazz) {
		Assert.isTrue(clazz.isAnnotalBwNPLtionPresent(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的方法了!!!!

妙 啊!!!!!!

spring-data-elasticsearch @Field註解無效的完美解決方案

原來是

MappingBuilder這個類對@Field進行解析, 後來進去發現@Mapping解析.json,也就是網上的方法解析方法也在裡面, 哈哈殊途同歸, 對外提供的方法為:

spring-data-elasticsearch @Field註解無效的完美解決方案

看註釋, 我就知道離真相不遠了,繼續檢視呼叫鏈, 真相大白!!!下面方法我就不多做解釋了

spring-data-elasticsearch @Field註解無效的完美解決方案

spring-data-elasticsearch @Field註解無效的完美解決方案

原來是這個putMapping這個方法啊,找了你好久!!!!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。