求荐基于Elasticsearch的精准商品搜索开源方案及文档预处理方法
解决方案与文档预处理建议
一、导入Elasticsearch前的文档修改
- 拆分变体结构:将
variant_ids的键值对结构转换为数组类型的variants_list,每个元素包含完整的变体属性(size、color、fit、gender、in_stock),示例:
便于后续嵌套查询过滤变体属性。"variants_list": [ {"size":30,"color":"Black","fit":"Narrow","gender":"Women","in_stock":true}, {"size":32,"color":"Blue","fit":"Narrow","gender":"Men","in_stock":true}, ... ] - 新增精确匹配字段:
- 针对商品名称,新增
name_en_exact字段,存储小写后的完整名称(如spring summer jeans),设置为keyword类型,满足精准匹配商品名称的需求。 - 针对品牌、类别等结构化属性,确保
attributes.brand、attributes.type等字段保留keyword类型的子字段(可通过ES映射设置,或预处理时新增brand_exact、type_exact字段)。
- 针对商品名称,新增
- 新增归一化分类字段:针对词形还原/类别归组需求,新增
normalized_main_category字段,提前通过规则或NLP工具处理:- 例如将"Chocolate milk"标记为"Milk","Milk chocolate"标记为"Chocolate",可基于自定义产品分类规则或依存分析实现。
- 构建统一搜索字段:新增
search_text字段,将name_en、attributes.brand、attributes.type、attributes.category等字段内容拼接为一段文本,用于全文搜索召回,同时保留结构化字段做精准过滤。
二、开源解决方案选型
1. 核心搜索逻辑(基于Elasticsearch原生能力)
- 精准匹配商品:使用
bool查询结合term过滤(匹配attributes.brand:Lee)和terms过滤(匹配attributes.type:Jeans),同时用match查询提升相关度。 - 多条件过滤:在上述查询基础上,添加
nested查询过滤variants_list.color:Black,可结合in_stock:true筛选在售变体。 - 精准匹配商品名称:使用
match_phrase查询name_en_exact字段,或直接用term查询该keyword类型字段,确保完全匹配。 - 拼写纠错:使用Elasticsearch的
Phrase Suggester或Term Suggester,基于search_text字段的分词结果生成纠错建议,查询时可返回候选纠正词并自动重试查询。 - 词形还原:自定义Elasticsearch分词器,集成
Snowball Token Filter实现词干提取,或结合自定义同义词过滤器处理类别归组(如将"Chocolate milk"和"Milk"映射为同一同义词组)。
2. 预处理工具(活跃维护的开源项目)
- NLP预处理:使用
spaCy或NLTK完成词形还原、依存分析,实现商品名称的类别归组(如识别"Chocolate milk"的核心类别为"Milk"),两个项目均持续维护,文档完善。 - 批量数据处理:使用
Pandas或Dask处理数十万条商品文档的批量转换,高效完成结构调整和字段新增。
3. 额外优化工具
- 同义词管理:使用
elasticsearch-synonyms工具批量生成和管理同义词规则,同步到Elasticsearch的分词器配置中。 - 拼写纠错增强:结合
Whoosh的拼写检查模块,提前为商品名称、品牌等字段生成纠错词典,导入Elasticsearch作为自定义suggester的候选词库。
内容的提问来源于stack exchange,提问作者StealthyMcStealthFace
相关产品推荐
相关产品推荐

