搜索引擎关键字智能提示的一种实现

2016/3/25 posted in  others

解决方案

关键字收集

当用户输入一个前缀时,碰到提示的候选词很多的时候,如何取舍,哪些展示在前面,哪些展示在后面?

用户在使用搜索引擎查找商家时,会输入大量的关键字,每一次输入就是对关键字的一次投票,那么关键字被输入的次数越多,它对应的查询就比较热门,所以需要查询的关键字记录下来,并且统计出每个关键字的频率,方便提示结果按照频率排序。

搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来。

拼音缩写提取

chongqing, zhongqing -> cq, zq

索引与前缀查询

方案一:Trie树 + TopK算法

Trie树即字典树,又称单词查找树或键树,是一种树形结构,一种哈希树的变种。

它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

从上图可知,当用户输入前缀i的时候,搜索框可能会展示以i为前缀的ininnint等关键词,再当用户输入前缀a的时候,搜索框里面可能会提示以a为前缀的ate等关键词。如此,实现搜索引擎智能提示suggestion的第一个步骤便清晰了

TopK算法用于解决统计热词的问题。解决TopK问题主要有两种策略:HashMap统计+排序(堆排序)。

HashMap统计:先对这批海量数据预处理。具体方法是:维护一个KeyQuery字串,Value为该Query出现次数的HashMap

该方案存在的问题是:

  • 需要维护拼音、缩写两棵Trie树。

方案二:Solr自带Suggest智能提示

该方案存在的问题是:

  • 返回的结果是基于索引中字段的词频进行排序,不是用户搜索关键字的频率,因此不能将一些热门关键字排在前面。
  • 拼音提示,多音字,缩写还是要另外加索引字段。

方案三 Solrcloud建立单独的collection,利用Solr前缀查询实现

专门为关键字建立一个索引collection,利用Solr前缀查询实现。Solr中的copyField能很好解决我们同时索引多个字段(汉字、pinyin, abbre)的需求,且fieldmultiValued属性设置为true时能解决同一个关键字的多音字组合问题。

Reference

http://tech.meituan.com/pinyin-suggest.html