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