前言
搜索提示要实现哪些功能?
a: 支持前缀匹配,如输入”海底“,提示”海底捞“
b:同时支持汉字,拼音输入 @hxx 有java组件可实现
c:支持多音字,如 ”chongqing“ 和 ”zhongqing“ 都应该提示”重庆“ @hxx 注意,多音字涉及到组合全排列
d:支持拼音缩写, 如“cq”,提示“重庆” @hxx 在b的时候抽取
e: 基于用户的历史搜索行为,按照关键字热度进行排序 为了提供suggest关键字的准确度,进行排序。
正文
1:mt的实现: trie树
a-c的实现: 将汉字全部转换成拼音(有pinyin4j依赖),可依靠trie树结构实现
d的实现:需要两个trie树
@hxx 这种方案的缺陷是查询和索引都需要进行多次的拼音转换
e: 记录用户查询记录和搜索历史查询记录(map<query,count>),根据 当前输入的query得到所有候选的词,进行top k
2: trie树
@hxx 为什么trie树是可行的?用户不会输入过长的关键字,当然我们的索引词也不会很大,响应速度为o(len),其中len为检索字符长度
例如,给出一组单词inn, int, at, age, adv, ant, 我们可以得到下面的Trie