
搞不懂搜索是什么意思?一篇看懂搜索引擎原理 我刚接触互联网那会儿,对“搜索”这个事儿也没啥概念,不就是输入几个字,然后出来一堆链接嘛后来自己琢磨着做点东西,才发现,这背...
搞不懂搜索是什么意思?一篇看懂搜索引擎原理
我刚接触互联网那会儿,对“搜索”这个事儿也没啥概念,不就是输入几个字,然后出来一堆链接嘛后来自己琢磨着做点东西,才发现,这背后水深得很,远不是按个回车键那么简单。
我记得最早折腾搜索的时候,就是想着怎么把我们网站上的资料找出来。一开始就是写了个脚本,定时去扫描文件,然后把关键词和文件路径存到一个大文本文件里。要搜索的时候,我就用shell脚本把那个大文本文件读出来,一行一行比对,找到就打印出来。慢得要死,而且关键词一多,那效率简直没眼看。
后来我意识到得有个像样的“索引”才行。就想着模仿一下搜索引擎的思路,从头搭一个简易的玩意儿。整个过程我把它拆成了几个步骤来搞。

最开始得有东西可搜?我先写了个小工具,模仿浏览器去访问网页,把网页内容下载下来。这东西我没用什么花里胡哨的库,就是用Python的requests库请求网页,然后用BeautifulSoup把HTML标签剥掉,只留下正经的文字内容。这个阶段就是数据的“获取”。
这个过程很耗时间,因为网络请求总是有延迟的,我得控制好爬取的频率,不然很快就被网站封了IP。
拿到一堆文本后,你总不能把一句话当成一个整体来存?得把它拆开,拆成一个个有意义的词。这就是“分词”。我当时研究了下,发现中文分词比英文复杂多了。英文用空格一隔就行,中文一堆字黏在一起。
我一开始图省事,直接找了个开源的分词工具包(那种基于词典的),导入了一堆词典文件。代码一跑,咔嚓,就把长句子切成了“我/爱/搜索/原理”这样的碎片。这每一步都是为了构建我们后面要用的索引。

这才是搜索的核心机密,也就是“倒排索引”。正排索引是“文档ID”指向“里面的词”,倒排索引反过来,“词”指向“哪些文档包含它”。
我搞了个HashMap(或者说字典),Key是分出来的词,Value是个列表,记录这个词出现在哪些文档的哪些位置。比如,“搜索”这个词出现在Doc1的第5个词的位置,Doc5的第10个词的位置。
我写了个程序,把爬下来所有文档的内容,通过分词器处理后,遍历每一个词,然后更新我的倒排索引表。每一次更新,都是一次IO操作,数据量一大,写起来就得小心翼翼,不然就写崩了。
等索引建好了,终于可以“搜索”了。用户输入一个词,比如“原理”。
我做的第一步,就是查我的倒排索引,拿到“原理”这个词在哪些文档里出现过。这时候,如果用户搜“搜索引擎原理”这么多个词,我就得把“引擎”和“原理”对应的文档列表都拿出来,算交集,找出同时包含这两个词的文档。
光是找到文档还不够,还得排序,用户肯定想看最相关的排在前面。我当时就简单粗暴地用了“词频”和“文档频率”的概念,算了个基础的权重分。哪个文档里,我的关键词出现的次数多,并且在整个语料库里出现得少,分数就高点。
然后,把所有匹配的文档,根据算出来的分数从高到低排好序,拿前十条结果展示给用户。
整个过程跑下来,我才算真正体会到,一个你每天都在用的搜索框背后,是多么复杂的工程。从爬取、清洗、分词、建索引,到的查询和打分排序,每一步都是门大学问。虽然我弄出来的东西只能在小圈子里玩玩,但至少让我明白了,搜索不是魔法,而是扎扎实实的数据结构和算法堆出来的玩意儿。