解决方案
关键字收集
当用户输入一个前缀时,碰到提示的候选词很多的时候,如何取舍,哪些展示在前面,哪些展示在后面?
用户在使用搜索引擎查找商家时,会输入大量的关键字,每一次输入就是对关键字的一次投票,那么关键字被输入的次数越多,它对应的查询就比较热门,所以需要查询的关键字记录下来,并且统计出每个关键字的频率,方便提示结果按照频率排序。
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来。
拼音缩写提取
chongqing
, zhongqing
-> cq
, zq
索引与前缀查询
方案一:Trie树 + TopK算法
Trie树即字典树,又称单词查找树或键树,是一种树形结构,一种哈希树的变种。
它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
从上图可知,当用户输入前缀i
的时候,搜索框可能会展示以i
为前缀的in
,inn
,int
等关键词,再当用户输入前缀a
的时候,搜索框里面可能会提示以a
为前缀的ate
等关键词。如此,实现搜索引擎智能提示suggestion
的第一个步骤便清晰了
TopK算法用于解决统计热词的问题。解决TopK问题主要有两种策略:HashMap统计+排序(堆排序)。
HashMap
统计:先对这批海量数据预处理。具体方法是:维护一个Key
为Query
字串,Value
为该Query
出现次数的HashMap
。
该方案存在的问题是:
- 需要维护拼音、缩写两棵
Trie
树。
方案二:Solr
自带Suggest
智能提示
该方案存在的问题是:
- 返回的结果是基于索引中字段的词频进行排序,不是用户搜索关键字的频率,因此不能将一些热门关键字排在前面。
- 拼音提示,多音字,缩写还是要另外加索引字段。
方案三 Solrcloud
建立单独的collection
,利用Solr
前缀查询实现
专门为关键字建立一个索引collection
,利用Solr
前缀查询实现。Solr
中的copyField
能很好解决我们同时索引多个字段(汉字、pinyin
, abbre
)的需求,且field
的multiValued
属性设置为true
时能解决同一个关键字的多音字组合问题。