Spring Data ElasticSearch(7.9.3)将字段添加到现有索引

Posted

技术标签:

【中文标题】Spring Data ElasticSearch(7.9.3)将字段添加到现有索引【英文标题】:Spring Data ElasticSearch (7.9.3) add field to existed index 【发布时间】:2022-01-08 08:13:23 【问题描述】:

我试图向现有索引(用户)添加一个新字段(bioAuto)。我有这个索引的 POJO:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
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 org.springframework.data.elasticsearch.annotations.Setting;

import java.time.LocalDateTime;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = IndexName.USERS)
@Setting(settingPath = "elastic/autocomplete_settings.json")
public class User 

    @Id
    private Long id;

    @Field(type = FieldType.Search_As_You_Type)
    private String userName;

    @Field(type = FieldType.Text, analyzer = "autocomplete_whitespace_only", searchAnalyzer = "autocomplete_search")
    private String bioAuto;



已创建字段,但类型错误,未连接到我的自定义分析器(在elastic/autocomplete_settings.json 中定义)。

创建的字段类型:

"bioAuto" : 
      "type" : "text",
      "fields" : 
        "keyword" : 
          "type" : "keyword",
          "ignore_above" : 256
        
      
    

正确的字段类型:

"bioAuto" : 
      "type" : "text",
      "analyzer" : "autocomplete_whitespace_only",
      "search_analyzer" : "autocomplete_search"
    ,

如果我重新创建索引(删除用户索引并再次运行应用程序),一切正常。 ElasticCloud:7.9.3,Spring Data 版本:4.2.6

附:如果我执行此命令,一切正常,在 Spring Data Elastic 中使用正确类型自动创建字段的问题

PUT /users/_mapping

"properties": 
    "bioAuto" : 
          "type" : "text",
          "analyzer" : "autocomplete_whitespace_only",
          "search_analyzer" : "autocomplete_search"
        
  

【问题讨论】:

【参考方案1】:

Spring Data Elasticsearch 仅在应用程序启动时自动为索引写入映射,当带有该索引实体的ElasticsearchRepository 发现该索引不存在时。否则不会对索引自动执行任何操作。映射不会被重写。 因此,如果您向实体添加了一些属性,即使您有注释,这也不会创建新的映射。

您可以做的是 - 在添加属性之后并使用此新属性插入新数据之前 - 使用 IndexOperations.putMapping() 方法编写更新的映射。 重要提示:您只能将新属性/字段添加到索引中,而不能删除或更新现有的;这是 Elasticsearch 的限制。

要了解如何在应用程序启动时自动完成此操作,请参阅我对这个 SO 问题的回答:Spring Data Elasticsearch : detect mapping differences

【讨论】:

非常感谢您的回答!但正如我注意到的,当我在 Elastic 中添加一个新实体时,字段会自动创建,但映射错误(它不会附加自定义分析器) 我知道了,当索引已经创建时,Spring 数据不会调用putMapping(),因此它不应用分析器。非常感谢!

以上是关于Spring Data ElasticSearch(7.9.3)将字段添加到现有索引的主要内容,如果未能解决你的问题,请参考以下文章

springboot 集成 spring-data-elasticsearch

Spring Data Elasticsearch

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?

Spring Data Elasticsearch

Spring Data ElasticSearch 使用