app里的“搜索提示“是如何实现的?

用程序员的角度科普生活知识
hello 兄弟们
我是浩说
今天研究个什么事儿呢?
咱就是说:我们在浏览器或者app里搜索的时候
为什么我只输入了一两个字 , 下面就已经给我罗列出来我想搜的具体内容了
这是怎么做到的呢?
“搜索"就是"问问题”
其实"搜索"对应现实场景就是"问问题"
这个过程就像是:
我问你:“炸鸡哪家比较好吃?”
【app里的“搜索提示“是如何实现的?】你的大脑可能是这样的思考过程:
首先从这句话中提取出两个关键词:炸鸡、好吃
接着将你去过的炸鸡店在脑子里列出来:
然后根据"好吃"这个关键词将炸鸡店列表重新排序排序:

app里的“搜索提示“是如何实现的?

文章插图
这样你就得到了答案 , 于是将排序前几名的店跟我一顿推荐 , 
顺便还向我甩了一句"怎么老铁想请我吃一顿啊?!"
其实大脑的思考过程和app的思考逻辑是一样的 , 
我们来具体探寻一下!
关键词
我们每个人使用app时的搜索需求都是不同的 , 比如购物app , 每个人想买的东西都不一样 , 
这个时候app会定时统计每个用户发送过的搜索内容并生成一个"关键词库":
列出来
年底将至 , 我们就以"年货"这个关键词为例 , 当我们在购物app里输入"年货"这个词的时候 , 
app就会从"关键词库"中将与之相关的词筛选出来:
然后再将这些关键词列出来 , 我们所看到的关键词通常是"列表"的形式 , 像这样:
但这是经过app处理之后的表现形式 , 对于app来说 , 关键词最初是以"树"的形式列出来的:
在编程语言里 , 这种数据结构叫做:
app里的“搜索提示“是如何实现的?

文章插图
Trie 树 (字典树)
Trie 树 (字典树)
为什么要用这种结构呢?
我们对比"列表"和“Trie 树”来看一下:
相比于"列表",Trie 树的优点在于:通过使用公共字符前缀的方式来节省存储空间 。
而"搜索"这种场景不就是根据公共前缀来匹配关键词集合吗 , 那使用Trie 树就再适合不过了!
排序
经过上一步"列出来"之后 , 由于数据过多 , app还需要将数据重新排序 , 并选择排名靠前的数据作为最后的"搜索提示"结果来展示给用户 。
至于app是如何"排序"的 , 这里面的内容就比较复杂了 , 涉及到一些公式化的算法 , 想要探讨的话一定是长篇大论且枯燥乏味 。
你可以简单的这样理解:按照关键词的搜索频率排序 , 频率越高越靠前:
排好序之后靠前的数据就是我们最终看到的"搜索提示"啦!某宝是展示了前十个:
今天我们探讨了"搜索提示"功能的实现原理
并借此了解了Java的数据结构:Trie 树
以及 Trie 树 的特点、适用场景
听说点赞分享的人虎年都能行大运发大财呢 , 还不赶紧行动起来!