如何在Elasticsearch中实现用户搜索文本的类目自动识别功能
搜索词类目识别功能实现方案(含亚马逊逻辑解析&Elasticsearch落地方法)
亚马逊类目识别的核心逻辑
- 离线预计算层:基于全站海量历史搜索、点击、成交数据,提前训练高频搜索词(如asus、iphone)和类目的映射关系,每个query对应1-3个高置信度类目,置信度超过阈值的直接作为默认推荐类目,响应速度极快
- 实时匹配层:针对未命中预计算词库的长尾query,实时做实体抽取(识别品牌、产品、属性维度的关键词),和商品库的类目特征做匹配召回最相关的类目
- 个性化调整层:结合当前用户的历史浏览、购买偏好调整类目排序,比如常买文具的用户搜“苹果”优先推文具类目而非3C类目
基于Elasticsearch的落地步骤
1. 基础数据准备
首先完善两个核心索引的结构:
- 商品基础索引:给每个商品的
category_path(类目全路径,如电子产品>电脑)字段设置keyword类型用于聚合,给商品标题、属性、类目名称字段配置同义词、拼音分词器提升匹配准确率 - query类目映射索引:专门存储高频query和类目的关联关系,核心字段为
query(搜索词)、related_categories(关联类目数组,含置信度)、hot_value(搜索热度),query字段配置search_as_you_type类型支持输入过程中的实时匹配
2. 预构建高频率query类目映射
拉取平台过往3-6个月的搜索行为数据,统计每个query对应点击商品的类目分布:
- 若某query下80%的点击都集中在同一个类目,直接将该关联关系存入query类目映射索引
- 每周定时更新一次这个索引,纳入新产生的热门搜索词
3. 实时查询流程实现
用户输入搜索词时按优先级做两次查询:
- 优先查query类目映射索引,用匹配查询命中搜索词后,若返回的最高置信度类目超过你设定的阈值(建议设为70%),直接返回该类目作为默认推荐,同步带出类目的关联筛选项
- 未命中预映射索引的长尾query,直接在商品索引做聚合查询获取匹配度最高的类目,参考DSL如下:
POST /你的商品索引名/_search { "size": 0, // 不需要返回商品明细,只要聚合结果 "query": { "multi_match": { "query": "用户输入的搜索词", "fields": ["title^3", "category_name^2", "attr_desc"] // 标题权重最高,类名次之 } }, "aggs": { "match_category": { "terms": { "field": "category_path.keyword", "size": 2, // 取Top2匹配类目 "order": { "_count": "desc" } } } } }
返回的聚合结果中,计数最高的类目即为匹配类目,你可以根据计数占总匹配数的比例判断是否作为默认推荐
4. 优化建议
- 给类目特征词设置权重:品牌词的匹配权重设为普通产品词的3-5倍,比如asus作为绑定了电脑类目的品牌词,匹配优先级远高于普通属性词,提升识别准确率
- 冷启动阶段如果历史行为数据不足,可以先手动给每个类目导入标准特征词库(比如电脑类目关联asus、联想、笔记本等词),后续随着行为数据积累自动迭代映射关系
内容的提问来源于stack exchange,提问作者Oussama ROUABAH
相关产品推荐
相关产品推荐

