You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:18:16