Spring Data Elasticsearch:如何将嵌套brand_suggest映射为字符串列表?
解决方案
要正确映射Elasticsearch中包含input和weight的completion字段,你需要创建一个对应嵌套结构的实体类,而不是直接用List<String>来映射。具体步骤如下:
1. 创建嵌套结构实体类
首先定义一个对应brand_suggest数组中单个对象的类,用来封装input和weight属性:
data class SuggestionItem( val input: String, val weight: Int )
2. 修改主实体类映射
将ESBrands中的brandSuggest字段类型改为List<SuggestionItem>,并保留正确的completion字段注解:
@JsonInclude(JsonInclude.Include.NON_NULL) @Document(indexName = "brands", createIndex = false) data class ESBrands( @Id @JsonProperty("id") val id: String? = null, @JsonProperty("brand") val brand: String? = null, @JsonProperty("brand_suggest") @Field(name = "brand_suggest", type = FieldType.COMPLETION) @CompletionField(preservePositionIncrements = false, preserveSeparators = false) val brandSuggest: List<SuggestionItem>? = null, )
原理说明
- Elasticsearch的completion字段原生支持包含
input(候选词)和weight(权重)的对象数组结构,通过嵌套实体类可以完美匹配这个格式。 @CompletionField注解会告诉Spring Data Elasticsearch该字段是completion类型,自动处理嵌套对象的序列化/反序列化,无需手动指定字段路径。
补全查询示例(可选)
如果需要基于这个字段做自动补全查询,可以用以下方式构建请求:
val suggestBuilder = SuggestBuilders.completionSuggestion("brand_suggest") .prefix("Ren") .size(10) val suggestResponse = elasticsearchOperations.suggest(suggestBuilder, ESBrands::class.java)
内容的提问来源于stack exchange,提问作者user1361815
相关产品推荐
相关产品推荐

