前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入拆解'搜索引擎'实现原理一:初识 '搜索引擎'

深入拆解'搜索引擎'实现原理一:初识 '搜索引擎'

作者头像
浩说编程
发布2021-09-10 15:54:58
6750
发布2021-09-10 15:54:58
举报
文章被收录于专栏:Java经验之谈

'搜索引擎'对于很多大厂来说已经不是什么新鲜技术了,

百度、淘宝等大型网站的搜索功能通常使用'搜索引擎'技术实现。

'搜索引擎'到底做了什么?

它和普通的数据库搜索有什么区别?

什么情况下才需要使用'搜索引擎'?

带着这些疑问,我们开始【对'搜索引擎'的探索】

'搜索'的本质其实是对'数据'的处理,所以我们先从'数据'讲起

数据类型

以搜索的角度划分,数据分为两种:结构化数据、非结构化数据(全文数据)

  1. 结构化数据:具有固定格式或有限长度的数据,就像我们用的数据库(创建字段必须指定格式)
  2. 非结构化数据:指不定长度或无固定格式的数据,如邮件、word文档

于是衍生出两种搜索类型

对结构化数据的搜索:也就是我们平时用的最多的,对数据库的SQL搜索,名称、状态、创建时间等

举个例子来说,我们假设公众号将我的文章信息存到了这样一张表中

table: id title author filepath(文章内容的文件上传之后返回的保存路径) createtime

当我想要查询标题中包含'搜索'的文章,一个SQL就可以:

代码语言:javascript
复制
SELECT * from table where title like '%搜索%'

这样就完成了一次结构化数据的搜索。

另一种就是对非结构化数据的搜索:即对邮件、word文档等做内容搜索

还是上面的例子,但这次我们希望搜索文章内容中包含'搜索'的文章,你会怎么做呢?

按照上面结构化数据的搜索思路,遍历数据库中所有的filepath,通过filePath获取到文章文件本体,将文章内容从头到尾扫描一遍,直到将所有文件都扫描完,返回匹配结果。

这种顺序扫描法想必不用说你也能想到效率问题,如果我有成千上万个文件,每个文件包含上千字,扫描量可想而知。

全文检索

既然顺序扫描法不可取,我们是否可以换个思路:

将非结构化的数据中的一部分信息提取出来,然后以某种规则重组,使其变得有一定的结构,然后对此结构数据建立索引并进行搜索,从而达到快速搜索的目的。

这种将非结构化数据拆分、结构化,建立索引并对索引进行搜索的搜索方式就叫做全文检索,即'搜索引擎'的设计思想。

就像是文字和字典的关系,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。

然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。

我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

还记得上面搜索文章内容的问题吗?我们试着用全文检索模拟一下:

假设现在我有100篇文章(编号0~100),我需要找出内容中包含'搜索'、'引擎'两个关键字的文章,

首先根据这两个词汇建立索引结构

左边保存的是一系列字符串,称为词典 。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表 (Posting List)。

这样一来,我们只需要将'搜索'、'引擎'两个链表做合并,即可得到搜索结果:

值得注意的是:虽然创建索引的过程和顺序扫描是一样的,但区别在于顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸,仅需要搜索创建好的索引即可。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用

以上就是本篇的内容,通过今天的内容我们了解了'搜索引擎'到底做了什么、它和普通的数据库搜索有什么区别、什么情况下才需要使用'搜索引擎'。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档