1 .应用场景
现在很多应用都有搜索联想功能,baidu,google,各种电商都有这种搜索智能提示功能,可以帮助用户尽快找到自己想要的,用户是比较懒的,所有这种还是比较常见的。如下图所示用户输入 “数据结构”,联想出下面的结果以及结果数量
2.实现原理
这种联想功能有两种实现方式
2.1 倒排索引
比如说lucene的 suggest模块),这种方式可以实现,但是有点大材小用,而且性能也是问题, 主要是通过编辑距离大于某个阈值就认为联想出来的词和下面的相关,分词也是必须采用NGRAM才行,要不然用户搜索的时候会发现结果会消失。索引大和查询性能都会有影响,所以不推荐这种方式,solr&es关于suggest模块没有做什么优化,es里面目spellcheck里面默认是2-Gram方法,关于编辑距离优化的方法 推荐看 N-Gram
2.2 字典树(trie)
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
3. trie原理
这里举个例子吧,比如我现在有 int, at, age, and 这几个词,我现在建树
线上主要场景是用户通过拼音和汉字都能搜索到相同的结果,这里就可以把拼音通过map映射成汉字就行
插入过程
对于一个单词,从root开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完,将最后的节点标记为绿色,表示该单词已插入trie树&