'搜索引擎& # 39;对许多大工厂来说,这不是一项新技术,
通常使用百度、淘宝等大型网站的搜索功能& # 39;搜索引擎& # 39;技术实现。
'搜索引擎& # 39;你到底做了什么?
它和普通的数据库搜索有什么区别?
什么时候需要用& # 39;搜索引擎& # 39;?
带着这些问题,我们开始【是& # 39;搜索引擎& # 39;探索】
'搜索& # 39;的本质其实是正确的& # 39;数据& # 39;处理,所以我们先从& # 39;谈论数据& # 39;
数据类型从搜索的角度来看,数据可以分为两种:结构化数据和非结构化数据(全文数据)。
结构化数据:格式固定或长度有限的数据,就像我们使用的数据库一样(创建字段时必须指定格式)。
非结构化数据:指长度不定或格式不固定的数据,如邮件、word文档等。
因此,产生了两种类型的搜索。
搜索结构化数据:即SQL搜索数据库、名称、状态、创建时间等。,我们平时用的最多。
举个例子,我们假设微信官方账号把我的文章信息保存在这样一个表中。
表:id标题作者文件路径创建时间
当我希望查询标题包含& # 39;搜索& # 39;文章,一个SQL就行。
SELECT * from表中标题如& # 39;% search % & # 39这完成了结构化数据的搜索,
另一个是非结构化数据的搜索:即邮件、word文档等的内容搜索。
还是上面的例子,但这次我们希望搜索文章的内容包含& # 39;搜索& # 39;文章,你会怎么做?
按照上面结构化数据的搜索思路,遍历数据库中的所有文件路径,通过文件路径获取文章文件本体,从头到尾扫描文章内容,直到扫描完所有文件,返回匹配结果。
不用说,你也可以想想这种顺序扫描方式的效率。如果我有几千个文件,每个文件包含几千个字,扫描量可想而知。
既然顺序扫描的方法不可取,那我们能不能换个思路:从非结构化的数据中提取一些信息,然后用一些规则重新组织,使其具有一定的结构,再对这种结构化的数据进行索引和搜索,达到快速搜索的目的?
这种对非结构化数据进行拆分、结构化、索引和搜索索引的搜索方法称为全文检索,即& # 39;搜索引擎& # 39;的设计理念。
就像单词和词典的关系一样,拼音表和部首词典相当于词典的索引,每个单词的释义都是无结构的。如果字典里没有音节表和偏旁字典,一个字只能在浩瀚的字海中顺序扫描。
但是可以提取一个单词的一些信息进行结构化处理,比如发音,更有结构性,分为声母和韵母,只能一一列出其中的几个,所以把发音拿出来按一定顺序排列,每个发音指向该单词详细解释的页码。
我们搜索的时候可以根据结构化的拼音找到发音,然后根据它指向的页数找到我们的非结构化数据——也就是单词的释义。
还记得上面文章内容搜索的问题吗,我们试着用全文搜索模拟一下:
现在,假设我有100篇文章(编号为0~100),我需要找出& # 39;搜索& # 39;、'引擎& # 39;双关键词文章,
首先,根据这两个词建立索引结构:
左边是一系列字符串,称为字典。
每个字符串都指向一个包含该字符串的文档链表,这个链表被称为Posting List。
这样,我们只需要把& # 39;搜索& # 39;、'引擎& # 39;合并两个链表以获得搜索结果。
值得注意的是,虽然创建索引的过程和顺序扫描是一样的,但是区别在于顺序扫描每次都需要扫描,而创建索引的过程只需要做一次,然后就一劳永逸了,只需要搜索创建的索引。
这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。
这就是本文的内容。通过今天的内容,我们知道& # 39;搜索引擎& # 39;你做了什么,它和普通的数据库搜索有什么区别,什么情况下需要使用& # 39;搜索引擎& # 39;。
下期预告下一篇文章,我们将深度拆解& # 39;搜索& # 39;引擎如何创建索引?为什么即使我输入了错别字,百度仍然返回正确的搜索结果?
更多工作做在同名微信官方账号:郝说编程,欢迎互相交流。
最新评论