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 BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch