当前位置: 首页 > 科技观察

搜索引擎告诉你大海捞针

时间:2023-03-16 21:02:31 科技观察

如果你问这样一个问题:像搜索引擎这样的全文搜索的底层原理是什么?对于有经验的人来说,这个问题很容易回答。因为现代搜索引擎基本上都是使用倒排索引来实现的。那么什么是倒排索引呢?建立倒排索引有些同学看到“倒排”两个字可能会有点慌。我知道你很着急,但别着急(bushi)这不是“倒需求”的倒转,而是“倒指数”的倒转。假设我们现在有3个网页,其中包含以下非常简单的内容:三个文档现在假设我们要搜索网页中的内容,那么第一步需要做什么呢?当然是建索引了。没有索引还想大海捞针?想到peach,相信大家对索引应该不陌生。平时看书看到的目录就是一种索引,MySQL中的聚簇索引和非聚簇索引也是一种索引。废话不多说,直接看人肉人工分词+建立倒排索引的结果:对三个文档的简历进行索引的效果。假设你要搜索单词jump,最后网页1和2会显示给你,因为跳转出现在两个页面中。这是倒排索引的一个非常简单的例子。搜索连续的单词怎么样?可能你还没有意识到问题出在哪里,我们举个例子来看看。在搜索引擎中搜索时,我们输入的ijump和“ijump”是不同的概念。前者表示包含单词i和jump的网页,后者表示包含单词i后跟jump的网页。比如搜索ijump预计会搜索到以上3个网页,但是搜索“ijump”只会搜索网页。3、此时我们思考一个问题,搜索引擎是如何实现上述功能的?在上面的索引表中,只有哪些词出现在哪些网页中,并没有关于词的位置的信息。因此,仅仅记录这些词出现在哪些网页是远远不够的。为了满足上面精确到词的位置的查询需求,让我们把词的位置也写到索引中,如下图:把词的位置加入到倒排索引中这样,当我们搜索“ijump”,可以根据索引中记录的位置来查找相邻词,如下图所示:根据有位置记录的索引查找相邻词。-4,由此可以推断这两个词在同一个网页的相邻位置。只搜索标题的内容怎么样?现在谷歌支持这种搜索。查询格式如下:intitle:${search_content},大家可以试试。那么这是如何实现的呢?显然,上述索引不能满足只查找标题的要求,因为它无法判断当前词是标题还是文本,那么这是如何实现的呢?首先,我们要知道如何识别“标题”。如果我们右击当前网友,选择查看源代码,就会看到HTML,这就是网页的“真面目”。网页的标题将用标签包裹,文本将用标签包裹。例如,如果我们给上面3个网页加上title标签,网页就会变成这样:带有titlebody标签的HTML网页。既然网页内容发生了“变化”(其实不是,因为本来应该是这样的,只是为了满足分步解释才这么说的),那么索引自然要更新。因为本质上我们需要知道哪些词是标题,所以新的这部分信息的索引如下:添加了标题信息的倒排索引,可以看到标题的文字和标识标题的标签都有已写入索引。通过这些信息,我们可以判断当前单词是否为Title。比如我们搜索intitle:Caesar,我们会先通过索引找到Caesar这个词,发现它只出现在第2页的位置2,那么我们比较的出现的位置,我们会发现2-2正好在标题的范围内:只通过标题位置的索引来查找标题。这样,我们就可以将搜索的范围限制在标题内。当然,这只是一个搜索操作。搜索引擎还有一个重要的部分——排序。将搜索结果排在用户最需要、最相关的位置,也是一项技术性很强的操作。后面会继续分享。