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