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

Spring Data ElasticSearch (7.9.3) add field to existed index

我正在尝试向现有索引(用户)添加一个新字段 (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 数据版本: 4.2.6

P.S。如果我执行这个命令,一切也都正常,在 Spring Data Elastic

中正确输入自动字段创建的问题
PUT /users/_mapping
{
"properties": {
    "bioAuto" : {
          "type" : "text",
          "analyzer" : "autocomplete_whitespace_only",
          "search_analyzer" : "autocomplete_search"
        }
  }
}

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

您可以做的是 - 在添加 属性 和 之前 使用这个新的 属性 插入新数据 - 使用 IndexOperations.putMapping()写入更新映射的方法。 重要提示:您只能向索引添加新的 properties/fields 而不能删除或更新现有索引;这是 Elasticsearch 的限制。

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