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 问题的回答:
我正在尝试向现有索引(用户)添加一个新字段 (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 问题的回答: