写一下个人spark实现的es completion suggester,
Overview
检索建议suggestion(补全completion和纠正correction)是提升用户搜索体验的一个重要功能,通过协助用户输入更精准的关键词,提高后续全文检索阶段文档匹配度。
检索关键词补全
检索关键词纠正
补全功能
在电商平台(淘宝、京东、Amazon等)上,检索建议补全可以帮助用户更准确、更迅速地定位到潜在购买商品。例如,用户输入空气
,电商平台根据用户的历史行为(login user)或者平台总体推荐结果(non-login user),给出有关空气
的一系列检索关键词(如空气质量、空气刘海、空气清新剂等),该检索关键词可以是简体、繁体、全拼、首字母拼音等形式。下面使用es的Completion Suggester来实现补全功能。
汉字补全
拼音补全
整体架构
架构模块组织如下,
检索建议补全架构
由三个模块,一个proxy,一条es总线组成。code将suggestion和normal隔离成2个index,不在normal mapping里加入suggestion,方便更好地管理和升级suggestion;也减轻normal es coordinator的压力。
分词
suggest分词
对于每一个需要index的商品名称,使用ik挖出其简体token;使用pinyin挖出其ik后的token的全拼连接和首字母连接。然后插入到suggestion index。
case class SuggestJson(
item_id: Long,
item_name_suggester: Seq[String]
)
//SuggestJson(93,List(han, dou, yi, she, 2017, ban, 女装, nvzhuang, nz, 夏装, xiazhuang, xz, 新款, xinkuan, xk, 宽松, kuansong, ks, xian, shou, 短袖, duanxiu, dx, 两件套, liangjiantao, ljt, 连衣裙, lianyiqun, lyq, oy6198, lu, 浅蓝色, qianlanse, qls)),(这里需要将`韩都衣舍`这个token加入ik词表,防止被切开)
normal分词
正常情况下分词的ik配置与suggestion配置要求一致,然后将其插入到normal index。
case class NormalJson(
item_id: Long,
item_name: String,
item_price: Double,
shop_name: String
)
//NormalJson(93,韩都衣舍2017韩版女装夏装新款宽松显瘦短袖两件套连衣裙OY6198陆 浅蓝色 M,116.0,韩都衣舍旗舰店)
检索历程
下面描述一下用户检索历程,
- 用户在前端输入一个query
- 该query经过proxy请求
search_suggestion_with_query
模块找到该query所对应的建议词列表(这里建议词最好是排序的,即返回与query相关性最高的建议词),并返回至前端,供用户选择 - 用户在sorted suggestion query list里面点选其中一个作为最终检索关键词(final query)
- final query经过proxy请求
search_doc_with_suggestion
模块,查询normal index里面的内容
纠正功能
还没有实现,但是可以使用Phrase Suggester和Term suggester来实现。
- Term Suggester,基于编辑距离,对analyze过的单个term去提供建议,并不会考虑多个term/词组之间的关系。
quert -> query
- Phrase Suggester,在Term Suggester的基础上,通过ngram以词组为单位返回建议。
noble prize -> nobel prize
- Completion Suggester,FST数据结构,类似Trie树,不用打开倒排,快速返回,前缀匹配
- Context Suggester,在Completion Suggester的基础上,用于filter和boost
query纠正
存在问题
- suggestion和normal的分离,suggested query的排序。如输入拼音,如果根据前缀查找规则,汉字是不会返回的,但是这里需要汉字
- 纠正功能的实现,todo code implementation
Reference
PREVIOUSJVM架构体系与GC命令总结