百度搜索引擎优化指南2.0(聊聊“吴牙签”背后的搜索引擎技术大家好,我是鱼皮 )
优采云 发布时间: 2021-09-03 20:01百度搜索引擎优化指南2.0(聊聊“吴牙签”背后的搜索引擎技术大家好,我是鱼皮
)
谈谈“吴牙签”背后的搜索引擎技术
大家好,我是Yuskin,今天给大家分享一些有趣的技术知识。
前两天想在网上买一包牙签,于是打开了某个搜索。
结果,我一头雾水。我发现的第一个内容不是摘牙工具,而是一个叫“吴牙签”的名人。
原来是最新的大瓜。看这牌子,又薄又破~
在吃瓜的同时,问题来了:为什么老吴在找牙签的时候不是先找到传统的牙签?
作为程序员,有必要给大家展示一下互联网搜索引擎的工作原理,看看它是如何帮助我们从数亿个网站中准确找到这根牙签的!
搜索引擎的工作原理
内容请参考百度官方搜索引擎工作原理介绍
先放一张官方的搜索引擎工作流程图:
搜索引擎工作流程
不明白也没关系,我们用一个实际的例子来帮助你理解。
数据采集
归根结底,用户搜索网站的内容来自存储网站的数据库。所以,搜索引擎做的第一件事肯定是先抓取每一个网站的数据。
当然,不可能把采集的数据全部交给人类,而是让机器(程序)自动采集。通常,我们称负责数据抓取的工具人为蜘蛛,即网络蜘蛛。
每个搜索引擎都有自己的蜘蛛,每个蜘蛛的行为不同,但基本原理相似。
整个互联网是一个巨大的蜘蛛网,网页嵌套在其中。网络蜘蛛沿着网络爬行(类似于有向图)。从入口开始,通过页面上的超链接关系,不断地发现和抓取新的网址。目标是抓取尽可能多的有价值的网页。
比如某作者写了一个与“吴牙签”相关的文章并发到某个写作平台,网络蜘蛛就可以跟随这个写作平台把这个文章抓取到自己的网络数据库中。
数据采集
听起来很简单,但对于拥有数亿数据量的搜索引擎,还有很多额外的考虑。
需要注意的问题
首先是存在重复失效的问题。对于像百度这样的大型蜘蛛系统,随时都有网页被修改、删除、失效或出现新超链接的可能。所以,与其抢网站就完了,还需要维护一个URL库和页面库,保证库中的网页真实、有效、无冗余。
还有其他问题,例如:
如何保证爬取网站的质量?垃圾广告和不良信息网站应该被拒绝。
如何保证抓取友好性?蜘蛛爬行的频率和深度要控制好,蜘蛛不能太重,把整个网都弄断了。
如何让爬取覆盖范围更大?抓取一些您无法捕捉的数据孤岛。
当然,问题远不止这些。设计一个搜索引擎的爬虫系统还是很复杂的,协议、算法、策略、原理、异常处理等都要考虑。以下是百度官方提供的爬虫系统基本框架图,展示了爬虫系统的宏观工作流程:
爬虫系统爬取配额的基本框架
如果我们发个网站,肯定希望其他同学能找到吧?那么最重要的一点就是让蜘蛛先抓住你,再抓住你。
通常情况下,数据抓取系统会综合评估网站,以确定抓取的次数和频率。
百度等搜索引擎主要根据4个指标确定:
网站更新频率:网站更新越频繁,蜘蛛爬取频率越高
网站更新质量:网站的内容质量越高,爬取的蜘蛛越多
连通性:蜘蛛必须能够顺利到达这个网站并且能够正常访问
网站评价:使用算法给网站评分也会影响收录度
数据处理
蜘蛛抓取网页并保存到网页数据库后,无法直接使用这个庞大的网页数据。
比如我要搜索“老吴牙签”,可能有数亿的网站存储在网络数据库中,而网站有这么多牙签。我怎么知道哪一个是老吴的?
虽然缓慢搜索肯定会有结果,但不要忘记用户不能等待!现在大家对网站的需求量很大,如果几秒钟内没有找到,你可能会怀疑是互联网。因此,搜索引擎必须面临的挑战是:如何提高搜索网页的效率?最好在几毫秒内完成。
为了实现这一点,搜索引擎首先对杂乱无章的网页数据进行页面分析,并对原创页面的不同部分进行识别和标记。比如影响搜索的几个关键字段:网页的标题(title)、关键词(关键词)、描述(摘要)等
老吴卖牙签
提取这些信息后,传统的关系数据库和顺序搜索算法无法满足毫秒级查询。为什么不改变主意?由于用户是基于关键词进行搜索的,如果他们提前知道这些关键词存在于哪些页面,是不是可以直接找到呢?即对内容进行切分,建立倒排索引。
分词就是将一个句子分割成多个词。英文分词比较简单,按空格分词就行。但是中文分词比较麻烦。传统的分词方法是先建立字典,然后线性匹配,但这种方法代价高昂且不准确。现在基本就是NLP(Natural Language Processing)、AI分词,包括分词、同义词转换、同义词替换等。
以页面标题的分词为例。例如,有两个网页。第一页的标题是“老吴卖牙签”,但会分“老吴”、“卖”、“牙签”。第二个网页的标题是“老吴牙签很大”,将分为“老吴”、“牙签”、“大”三个部分。
分词后,根据分词结果建立倒排索引。
如果前向索引就像一本书的目录,它可以帮助我们根据页码找到对应的章节;那么倒排索引就像一个备忘单,预先记录下问题答案所在的页码,然后根据页码快速找到问题的答案。
在上面的两个网页上创建一个正向索引:
网页id标题内容1老吴卖牙签xxx 2老吴牙签很大xxx
创建倒排索引:
网页中存在索引id索引文本id1老吴1、22卖13根牙签1、24很大2
倒排索引创建并存储后,如果用户搜索关键词“大”,他只需要从倒排索引表中找到索引文本等于“大”的行,并检索id收录该词的网页。然后就可以根据网页id在前向索引中找到该网页的所有信息。
数据检索
单靠倒排索引无法支持用户快速搜索。最终数据检索链接中也有来自大学的提问。
比如为什么搜索“老吴不是牙签”,却能找到“吴牙签”?
显然,前者不包括后者,对吧,我们常用的字符串匹配算法像,正则等都找不到结果。
说说搜索引擎的做法。
先放一张百度搜索几年前提供的数据检索流程图。大体思路没问题,但有些步骤的细节可能有所不同。
数据检索过程1.分词
首先,像建立倒排索引一样,对用户输入的查询文本进行分段,比如搜索“老吴不是牙签”。可能的分词是:“老吴”、“否”、“牙签”。
2.查询倒排索引
对于这3个关键词,从预建的倒排索引中找出网页集:
关键词收录关键词老吴的网页1、网站 2不是网页 3 牙签网页1、网站2
然后取交集(并且所有关键词都必须收录这个页面,查询要求更严格)或者联合(包括任何关键词)作为候选集。
这里为了得到更多的结果,以联合集为候选集,结果为:网页1、网站2、网站3。
3. 相关性评价
其实就是对候选集中的网页进行打分,根据上一步的索引查询结果,计算用户的搜索与网页实际内容的相似程度。
一个非常常见的评分算法是TF-IDF,它是搜索引擎技术Elasticsearch和Lucene最主流的评分机制。在Elasticsearch中,评分算法结合向量空间模型、协调因子、词权重提升等,形成实用的评分函数,提高搜索的有效性。
TF 是词频,即关键词 在网页上出现的频率。频率越高,权重越高。 “toothpick”关键词出现5次的网页明显比只出现一次的词权重。
公式如下:
//单词在文档中出现次数的平方根
tf(tind)=√频率
IDF是逆向文档的频率,即关键词在集合中所有网页中出现的频率。东西越贵,越不流行的词,权重越高。
在上面的例子中,“not”这个词显然是最稀有的,所以“Page 3”这个词的得分更高。
公式如下:
//将索引中的文档数除以收录该词的文档数,然后求对数
idf(t)=1+log(numDocs/(docFreq+1))
另外一个因素是norm(字段长度的归一化值)。假设同一个网页的标题和内容都收录“牙签”,并且标题很短,内容很长,那么标题中出现“牙签”的权重会更高。
//字段字数平方根的倒数
范数(d)=1/√numTerms
用户搜索文本中的每个关键词 都必须根据这些因素进行评分。最后结合每个词的权重累加得分,计算出每个候选网页的最终得分。
最终公式如下:
有用的评分功能
有兴趣的朋友可以阅读《Elasticsearch: The Definitive Guide》的相关性评分章节。
地址:
在上面的例子中,计算得分后,结果集如下:
网页标题评分页1 老吴卖牙签0.9 网页2 老吴牙签很大0.8 网页3 不是0.7
第1页比第2页匹配两个关键词,但前者较短,因此得分略高。
4.过滤
以上步骤只是计算候选网页的分数,但并不是所有这些网页都可以搜索出来,还要通过各种过滤,比如过滤掉死链接(无效网站)、重复数据、各种“你知道”网站 等
5.排序
经过上面的步骤,我们终于得到了3个网页,但是应该把哪个网页放在第一位呢?
回到开头的问题:为什么在搜索牙签时先找到的是老吴而不是传统的牙签?
<p>这个问题取决于最终排名。现在一般都是用机器学习算法,结合一些信息,比如上面提到的相关性、网站质量、流行度、时效等,最能满足用户需求的结果先排序。