商品搜索要支持中文分词、筛选和精确排序,你会怎么设计 Mapping 和查询?
我的判断
商品搜索的 Mapping 要把全文检索与精确筛选分开:文本用合适分词,品牌类目用 keyword,价格与时间用数值和日期。
商品名称我会做 multi-field:name 用中文分词参与召回,name.keyword 用于精确匹配或排序;品牌、类目、状态用 keyword,价格用整数分,创建时间用 date。动态字段会限制或关闭,避免脏数据制造 mapping explosion。
"name": {
"type": "text",
"analyzer": "ik_max_word",
"fields": { "keyword": { "type": "keyword" } }
}
查询用 bool:全文词放 must/should 参与评分,品牌、类目、上下架和价格放 filter,避免无意义算分;排序先明确是相关性、销量还是价格,并补 _id 或业务 ID 做稳定游标。
上线前拿真实搜索词验证分词、召回率、零结果率和延迟。分析器改变通常要新建索引重建数据,通过 alias 灰度切换,不能直接在原字段上修改。
容易答偏踩坑误区
- 所有字符串都设 text。 聚合和精确筛选会出问题。
- 所有条件都放 must。 不需要评分的条件应放 filter。
- 直接信任动态 mapping。 日期、数字和字段数量可能失控。