一种是存储介质损坏导致的数据丢失,另一种就是数据从存储介质上删除。前者的话,比如硬盘碎了,数据是无法恢复的;后者的话,大部分文件系统是这样设计的,一部分是索引区,另一部分是数据区。当我们新加一个文件时,先往索引区里添加一条文件索引信息,然后往数据区里写入文件的完整内容。当删除一个文件时,一般只会将它的信息从索引区里删除,而数据区里的内容却不做删除,只是标记为无人使用,如果有新的文件写入系统,那么这些被标记无人使用的区域很有可能被新文件覆盖掉。
所以,当我们手贱误删了一些文件后,想要恢复它们是有可能的,就是需要保证没有其它的数据进来,将误删的文件数据覆盖掉。
数据库索引,对数据库里的某个属性的所有值进行排序,从而加快查询速度,是一种典型的空间换时间的思想。
聚簇索引:
按照数据的物理存储顺序建立索引。建立聚簇索引会改变数据库表的存储结构和数据排序,所以一张表只能建立一个聚簇索引。
非聚簇索引:
非聚簇索引并没有改变表的存储结构和数据排序,而是另外开辟了一块存储区域保存索引。索引中的关键字(name)是有序排列的,进而可以提供高效的查询。同时,索引中的每一行都有一个指向数据表中具体数据的指针,通过索引查找的结果可以快速的定位到具体的数据。
一张数据库表可以建立多个非聚簇索引,这样可以针对不同的查询需求对不同的列分别建立索引,但每个索引都会额外的消耗大量的存储空间。
一般是通过 GUID 来标识用户设备,通过手机的mac 地址以及 imei 号进行一定的运算后生成可以唯一标识一个设备的码(山寨手机很多,这种方式不能保证绝对唯一了),相当于标识一个用户了。
在一个应用中使用的时候应用将用户的唯一标识写入剪切板,如果用户
又打开另外一个应用,另外一个应用从剪切版中把用户标识取出,继续记录用户浏览器行为,这样就将整个跟踪过程串联起来了。
增量更新就是只将 App 中有发生改变的部分发送给用户,而不是每次都重新下载一个完整的安装包,这样就可以为用户节约大部分的流量了。
首先生成差异包 - >下发差异包 - > 合成新包 - > 校验完整性
增量更新和动态更新比较容易混淆,虽然两者好像都是下载一个补丁包。增量更新是将补丁包合并后生成一个完整的应用安装包,用户需要重新安装才可以使用,而动态更新则是替换应用中的某个模块,用户不需要重新安装应用,甚至都不需要重启应用,两者各有自己的应用场景。
app 会每隔一段时间向服务器报告自己还活着,就像心跳一样,服务器收到后,就知道这个通道是可以继续使用的了。然而天下没有免费的午餐,发送心跳是有代价的,一般手机锁屏之后,为了省电 CPU 是出于休眠状态的,然而发送心跳就会唤醒 CPU,必然会增加电量的消耗。这还只是一个长连接通道的情况,如果手机里装了 2、30 个带有推送的 app 呢?先别急着抱怨,聪明的 android 工程师和 ios 工程师早就想到了这一点,他们分别设计了 GCM 和 apns 来解决多个 app 有多个长连接通道的问题。以 apns 为例,ios 开通了一条系统级别的长连接通道,
通道的一端是手机的所有 app,另一端是苹果的服务器。app 的服务器如果有新的消息需要推送的话,先把消息发送到苹果的服务器上,再利用苹果的服务器通过长连接通道发送到用户手机,然后通知具体app。这样就做到了即使手机安装了 100 个 app,也只需要向一条通道里发送心跳。
回到 Android,系统提供的 GCM 只能在 Android2.2 以上才能使用,3.0 以下必须要安装Googleplay 并登陆了 Google 账号才能支持。而国内发行的手机大多是阉割掉了 google 服务的。因此,对于 Android 系统来说,各家 app 只能各显神通,开发自己的专用长连接通道了。然而这时候他们遇到了 app 的天敌:管家和卫士们。前文说了,app 想要及时收到服务器推送的消息,关键在于自己与服务器的长连接通道不被关闭,也就是自己的后台服务可以一直在后台运行,而管家和卫士们的一键清理功能就是专治这种「毒瘤」的。道高一尺魔高一丈,app 在与管家和斗士们的长期斗争中,总结了一系列躲避被清理掉的方法,什么定时
自启能力、什么相互唤醒、什么前台进程等等,当然这就是另一个话题了。
总结起来,app 和后台的连接方式有两种。一种叫 pull,也叫轮询,就是定期的不断向后台请求,缺点是耗电,费流量,不环保。对于一名有追求的程序员,他应该会比较恶心这种方式的,你千万不要对他说,我不管你怎么实现,我就要这种效果这种傻逼话了,凡事应该找到最优路径。另一种叫 push,app 和后台一直维持了一条通信通道,两端不定期的就会偷摸的约会,告诉对方「I‘m Here」,也能顺带把信息互相携带了。缺点是要维持一条长连接通道,这条通道容易被其他程序杀死,要多想复活办法。
缓存系统经常分为两级,称为一级缓存,二级缓存。一级缓存也叫内存缓存,二级缓存也叫硬盘缓存(手机 App 中,在 Sd 卡上)。显然,一级缓存存取速度更快,程序退出数据就消失,不可一直保留,且多占了一些内存。二级缓存容量可以更大,速度要慢一些,程序下次启动时候,依然可以使用。
账号登录几乎是每个 APP 必备的一个功能。我们在开发一个 APP 的时候,第一件事情几乎就是建立一个账号系统。我们来看下技术上是如何实现的,主要会涉及到一些安全上的问题。
从前有个大户人家姓白,富可敌国,家中收藏了大量的奇珍异宝。有一天,当地博物馆的馆长找到白先生,想为白先生在博物馆设立一个展台,每天借白先生家中的一些收藏品放在展馆展示。白先生觉得这个主意不错,但又不想把库房的钥匙给馆长,就让馆长去联系库房商量宝物借用事宜。库房跟白先生确认这件事之后,给了馆长一蓝一红两张令牌:蓝色的令牌上标注着使用日期,在有效期内,馆长可派人用蓝色令牌随意借还张家的宝物;当蓝色的令牌失效后,馆长需要派人带着红色令牌到库房这里换新的蓝色令牌。馆长拿到这两张令牌后,欣然离去。上面的栗子,简单叙述了移动应用微信登录的授权流程,以及授权后用户数据的获取方式(使用令牌),文中的「白先生」就是用户,他授权「馆长」(三方应用)使用自己存放在「库房」(微信服务器)中的宝物(用户数据、关系链等)。「蓝色令牌」是「库房」给「馆长」借用宝物的通行证,有一定的时效性,这是由于「蓝色令牌」使用的较为频繁,万一「遗失」或者「被盗」,造成的损失也有限。「红色令牌」则是「馆长」更换「蓝色令牌」的凭证。
微信授权登录系统基于 OAuth(发音:偶奥斯)2.0 协议标准,它提供了一套简单,安全的交互流程,让三方应用可以在不知道用户微信登录名和密码的情况下,访问用户在授权方服务器上的私密数据和资源。当三方应用需要使用微信授权登录功能时,需要先在微信开放平台获得对应的AppID 和 AppSecret。下面,我们看下微信授权登录系统的授权流程:
1、 用户请求三方应用用微信号登录。
2、 三方应用使用 AppID 向微信开放平台(客户端)发送登录请求。
3、 客户端加载授权页面,请求用户确认。
4、 用户点击确认按钮。
5、 微信客户端拉起三方应用,并将临时授权码(code)传递给三方应用,予授权完成。
6、 三方应用使用临时授权码(code)、AppID 和 AppSecret,通过 https 协议向微信开放平台(服务器)请求 access_token。
7、 服务器返回 access_token 和 refresh_token。
access_token 就是从服务器获取用户数据的「蓝色令牌」,refresh_token 则对应「红色令牌」。
access_token 的有效期是两个小时,refresh_token 的有效期是 30 天。
通过分析授权流程可以看出,要想获取 access_token,需要同时具备临时授权码(code)、 AppID 和 AppSecret 这三个信息,其中临时授权码由用户点击「确认登录」按钮后由服务器生成,它的有效期只有几秒,所以三方应用只要妥善的保管 AppSecret 和access_token,整个流程的安全性是值得信赖的。
APP 请求了定位权限之后,就会通过系统接口获取当前手机的经纬度,上传给服务器。如何获取经纬度?首先想到的就是 GPS 了。GPS 的原理是,天上飘着几颗卫星,不断的广播自己的位置。定位时,打开你的手机里的 GPS 信号接收器,收集至少 4 颗卫星发出的信号,用收到信号的时间乘以光速可以算出你和每颗卫星之间的距离,再加上每个卫星的位置已知,就可以确定你的位置了。
GPS到了室内没了卫星信号就不行了,这时候就轮到定位两兄弟:基站定位和 WIFI 定位出场了。他们的原理很相似。前面说定位的关键是参照物,基站定位的参照物是就是基站。运营商通过查询你手机连接的基站的位置,就能找到你。WIFI 定位的参照物是无线路由器。是你连接到无线路由器的时候,上传了该路由器的 MAC 地址,服务器通过查询公开的 MAC 地址对应的经纬度来找到你。
整个过程相当于应用在系统中注册自己,通常应用公布自己的能力的方式是注册 Scheme,我们 常见的 Scheme 就是 http:了,声明了这个 Scheme 的应用声称自己支持 http 协议,能够打开网页了(不过实际能不能打开,鬼知道),还有一些常见的 Scheme比如 file:,tel:等,当然,应用不仅可以声明这些标准的 Scheme,也能声明自己独有的Scheme,比如微信的就是 weixin:,QQ 的是 mqq:,那如果多个应用都声明相同的 Scheme呢?比如王五说自己会发照片,赵六也说自己会发照片,这时系统会有一定的策略来保证公平性,比如 Android 上,系统就会弹出支持的应用列表,让用户选择,IOS 则替用户选择近打开过的支持应用。
理解了调用的方法,那么后面数据传递就很简单了,只需要在 Scheme 后面携带上需要传递的信息就可以了,比如:wangwu://action=sendphoto,photopath=xxxx,后面的数据 终会带到声明 wangwu 这个 Scheme 的应用中,但是王五收到了信息并不知道是谁发的,该回信息给谁,那么怎么回调呢,也很简单,发起调用的张三在 Scheme 后面的参数加一个backScheme=zhangsan: , 这 样 王 五 就 知 道 了 如 果 需 要 回 信 息 , 则 构 造 一 个zhangsan://xxxxxx,这种自定协议可以叫做伪协议,这些字段也不是规定死的,只要交互双方自己能识别处理就行。
网络中的数据传输过程与量子传输技术类似,需要先将原始数据拆解,最终转化为电平或者光信号后在物理介质上传输。原始信息的「分解」和「还原」都是在协议栈中进行的。
• 应用层:为应用程序提供数据传输的网络接口,例如我们常见的 http、ftp 等协议都工作在这一层;
• 传输层:传输层提供端到端的连接,说白了就是让 A 主机上的程序 a 找到 B 主机上的程序 b,TCP 和 UDP 协议都是工作在这一层,端口号的概念也定义在这一层;应用层协议将数据打包好了之后丢给传输层进行传输。
• IP 层:这个就不用多说了,路由的主机寻址都是靠它,它存在的目的就是为了让两台主机能在 Internet 的茫茫「机海」中找到彼此。
• 数据链路层:网卡就工作在这一层,负责将数字信号转化成可供物理层传输的电信号或者光信号;
• 物理层:这个没啥好说的,就是信号传输的物理通道,比如网线和配套的接口。
协议栈中的每一层都起着承上启下的作用,应用程序产生的数据,经过这五层协议栈模型自上而下逐层「分解」最终变成可供物理介质传输的信号,当到达目的主机后,再自下而上「还原」成应用程序数据。
网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机。那么我们通过ip和mac找到了一台特定的主机,接下来通过端口来标识这台主机上的应用程序,端口即应用程序与网卡关联的编号。
详情可见:https://blog.csdn.net/yonggeit/article/details/79115649
如何解决环境依赖?如何解决大规模部署?如何解决应用与应用的互相影响?Docker 就是这些问题的一种解决方案,它是一个容器,也可以说是一个软件集装箱,这个箱子里面可以塞入特定版本的操作系统、数据库、服务器程序和web 应用,这样一套完整的 web 服务就集成在这个箱子里面了,当要发布服务的时候,直接将这个集装箱放在我们的服务器船上。Docker 算是一种轻量级的虚拟机,它比起传统的虚拟机更快,更节省资源。
电脑IP要看你指的是局域网还是公网,局域网是自己设置的,公网是由宽带连接决定的。服务商对接入网络时的电脑都会动态分配一个IP地址。
公网IP是没有重复的,不过通常一个出口IP可以有多设备连接。比如公司的公网IP是52.8.8.8,所有连接公司网络的电脑上报的公网IP就全是52.8.8.8
不同局域网的IP可能有重复,但同一局域网的IP没有重复。同一局域网会根据mac由DHCP服务器分配内网IP,员工A和员工B的内网IP分别是172.1.1.1和172.1.1.2
www.ip138.com 上查到的IP 是 NAT 转换后的外网 IP,而系统属性中查到的 IP 是内网 IP。
ping 是 TCP/IP 协议族中的一部分,它的原理是向目标 IP 地址发送一个数据包,如果对方返回一个同样大小的数据包,则证明连通。并且整个过程能够测试时延。
以太网适配器,也就是常说的网卡。
网关的意思类似,是两个网络之间的桥梁, TA 仅仅是一个逻辑上的概念,在物理上,TA 表现为一个 IP 地址。网关启到了转发、过滤和安全的作用。
虽然 Http 协议是无状态的,但是仍然可以在协议层之上对其进行扩展,也就是现在主要讲述的 session 机制。session 翻译成中文为「会话」,其实是指客户端和服务端会产生联系,在标准的 http协议中,他们其实是不会产生联系的,session 机制弥补了这种不足,弥补了 http 协议无状态的问题。session 机制主要是指服务端记住用户的能力,这往往要靠客户端 cookie 机制来辅助实现。
在系统编程实现的时候,相当于后台对浏览器种植 cookie,这样对小明进行了标识,同时在后台系统中增加一条记录,称为 sessionid,session id 的值,就是浏览器的 cookie 的值,这样浏览器端和服务器端就可以对应上了。
端口,即终端留给外部的接口,是不同设备间通信的桥梁。物理上用来沟通的我们可以叫做物理端口,比较常见的像电脑的网孔,USB 端口这些。一个 USB 端口是要如何才能适应这繁多的外设呢?靠的是驱动,驱动是外部硬件设备跟计算机之间交流时的翻译。
计算机中有很多的服务,这些服务运行在各自的进程当中,很多服务都和外部有沟通的需求。很显然,我们不能为每个服务都开一个物理网络端口,一般情况下,所有的服务发的数据都是从一个物理网络端口发出去的,当然,外部回应的数据包也都是从这一个网孔挤进来的。
那么问题来了,如果数据都挤在一起收发,服务怎么知道哪个回来的数据才是自己需要的?为了解决这个问题,计算机有了虚拟端口这个概念,一个服务想和外部进行信息互通时,需要先绑定一个端口号,不需要真实打孔,用一个数字表示就好,这个服务在发数据包的时候带上自己的端口号,同时还要指定目标服务的端口号。计算机收到数据包时,会根据数据包中标明的端口号,将数据放到对应服务声明端口的缓冲区中,等待服务取走数据包。
TCP/IP 协议,其中 TCP(Transmission Control Protocol)称为传输控制协议,IP(Internet Protocol)称为因特网互联协议。其实 TCP/IP 协议,是一个协议簇,就是一大堆协议的集合,这一大套协议定义了整个互联网通信的基础,比如一次网络链接要经过哪些步骤,一块数据传输过程中应该如何解释,这块数据该如何展示给编程者等等问题。
TCP/IP 协议又分为了 4 层,分别为应用层,传输层,IP 层,物理层。重点介绍下传输层,也就是 TCP,UDP 两个协议。TCP 是需要对方确认的,也就是传输之前需要进行「三次握手」(这里又是一个专有名词,就是传输的两端要经过三次确认,才能开始通信)。UDP 是比较粗暴的,不管对方什么情况,直接发送,不需要确认过程。很多博客和书籍中说的,TCP 是可靠的链接,UDP 是不可靠的链接就是这个意思。可靠的链接带来的是效率的下降,比如一次网络请求很大一部分时间都是浪费在互相确认的过程当中,资源消耗比较多,但是保证了数据的传输是可靠的,并且数据传输是有序的。不可靠的链接带来的是效率的提升,但可能服务质量有下降。
POP 的大名是 Post Office Protocol,中文是邮局协议,听起来高大上,但是它很弱,只是支持从邮件服务器上将用户的邮件下载到本地。标准的协议中,使用 POP 下载过的邮件都会从邮件服务器上删除,不过大家都觉得这种行为很不合理,然后大部分邮件服务器都改良了它,支持下载邮件并不删除服务器上的副本。POP 的一个优点,就是支持离线所有邮件,如果你长期处于断网的情况,又想查看每一封邮件,那你可以在客户端上配置使用 POP来接收邮件。
IMAP 是另一种从邮件服务器下载邮件的协议,它比 POP 要强大一些,它在从服务器获取邮件的时候,可以选择先获取标题和摘要,当你想看具体内容时,再去拉取正文,同时,它还可以将你对邮件处理的一些状态(如标记为已读、删除)同步给服务器,这样你在另外一个客户端上就不用再处理一次了。
接着谈发送邮件,一封邮件从客户端到自己的邮箱服务器,再从自己的邮箱服务器到对方的邮箱服务器,都是使用的 SMTP(Simple Mail Transfer Protocol)协议进行传输的,它是一种「推」的协议,将邮件推送给服务器。
通常我们所说的代理,都是指的客户端向外界发起请求时,并不是直接与目标服务器连接,而是经过一个代理服务器,将所有请求交给代理服务器,由它去负责连接外界的目标服务器,同时从服务器返回的数据,也经过代理服务器,返回到客户端。在外界看来,所有请求都是来自这台代理服务器,这样就成功的将客户端隐藏在自己身后,起到了一种保护客户端的作用。
而『反向代理』却是反过来的,它是针对服务器的一种代理技术。反向代理服务器可以接受客户端的请求,然后将它分发到被代理的服务器上,待这些服务器处理完请求后,再将结果转发给客户端,它是将服务器隐藏在自己的身后。从客户端看来,它面对的只有一台服务器,但是背后可能有 1000 台服务器在提供服务。
首先,它可以做『负载均衡』。比如说,对于同一个 web 服务,有 10 台服务器可以提供服务,但是每台服务器的负荷不太一样,如果一个请求发送到负荷较高的服务器,那么它的处理时间可能会稍长一点,但是客户端是不知道哪一台服务器比较空闲,所以将请求发送到『反向代理』服务器,它是知道每台服务器的负载的,这样由它将请求转发到相对空闲的服务器,以便更快的响应客户端。
然后,它可以减轻后端服务器的一些压力,比如很多静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求传递到后端服务器,相对来说减轻了后端服务器的压力。
它还可以对请求做进一步的封装和解封,比如想把所有请求升级到 ssl 加密连接,却不想改造后端服务器,那么可以只在客户端-反向代理服务器之间使用 ssl 加密连接,而代理服务器-后端服务器之间仍旧使用普通 http 连接,这样就事半功倍了。
「内容分发网络」,英文名是 Content Delivery Network。
CDN 专注于「内容」,也就是 CDN 的 C 所代表的 Content,专注于静态资源的分发和访问,比如一张图片,一个文本文件,一个视频,一个 CSS,一个 JS 等等,任何以文件形式存储的,为了提高在互联网上的访问速度和质量,都可以将这个资源部署在 CDN 这个网络上。
CDN 动作是「分发」,也就是如何让刚才提到的那些「内容」快速的部署在这个网络中,从而快速为用户服务,其实还有一层更重要的含义是用户的快速访问与就近接入,分发的目的是为了用户更好的体验。
CDN 落定于「网络」,是部署于全国或者全世界的一大堆服务器,这些服务器基于当前互联网的基础架构在其上层再构成一个网络,这个网络专为资源分发而生。
我们可以推导出 CDN 的作用是:CDN 厂商构建了一个基于互联网数量巨大的服务器,专注于内容和资源分发,方便用户快速访问,提升用户体验的一个内容网络。
首先要说的是应用服务器和资源服务器应该解耦,也就是应用服务器只处理逻辑,而资源服务器存放内容或者叫资源。术业有专攻,如果混在一起,会拖慢应用服务器的速度,如果没有 CDN 来专门处理资源,那所有的资源部署可能会离用户很远,保证不了体验,专业的CDN 服务商专注于这里,并且规模也让成本不断下降,就像许多公司周边产品都是外包出去,自己也可以做,只不过专门生产礼品的公司会更有效率、更专业、价格也更低、不耗费自己公司的人力资源。
总结一下,CDN 是一种资源的分布式存放和备份的方法。
HTTP(HyperText Transfer Protocol)超文本协议,是互联网上的一个基本协议,而在打开一个网页时,表示以 http 协议的方式来获取这个网页的内容,其中包括了网页文本和各种图片资源。如果你想以加密的方式访问,还可以使用 https 协议来获取资源。
在传统的 HTTP 协议中,应用层的 HTTP 协议将应用程序?供的数据封装后,明文交给位于运输层的 TCP 协议发送到网络上。由于是明文传输,发送的信息可以在传输过程中被任意篡改,甚至被完全替换。
HTTPS 中文学名「安全超文本传输协议」,HTTPS 协议在 HTTP 和 TCP 之间添加了一层 SSL 协议。SSL 是用来保障网络上数据传输安全的一套协议,它在传输层对 HTTP 进行封装加密,然后将数据交由 TCP协议发送到网络上。使用 HTTPS 的服务器,需要在受信任公司申请一套数字证书,也就是密码学中的公钥和私钥,用于进行非对称加密。公钥加密的数据需要用私钥解密,私钥加密的数据需要用公钥解密。
1、 客户端发起 https 请求;
2、 服务器将公钥发送给客户端,客户端可以根据公钥验证服务器的身份。
3、 客户端生成一个加密密钥,公钥加密后,将密钥传输给服务器,服务器用私钥解
密报文获得客户端密钥;
4、 服务器和客户端的数据传输都通过客户端密钥进行加解密。
抗日战争时期,我党两个指挥部之间需要进行加密电报通信安排作战计划,但是两方当前用的都是非加密的电码本(明文传输),通信内容很容易被敌方破解。正巧,指挥部 A(服务器)有一个便携保险箱(公钥)和钥匙(私钥),于是便派通信员小张单独将保险箱(公钥)秘密送达了指挥部 B(客户端),保险箱的钥匙(私钥)还是被保存在指挥部 A。指挥部 B(客户端)收到箱子后,一看上面印着的五角星,便知其来由,于是将加密后的电码本(客户端加密密钥)放在了箱子里,将箱子锁好,由小张带回了指挥部 A。指挥部 A 收回箱子后,用钥匙将保险箱打开,这样,两个指挥部便都有了加密后的电码本(客户端加密密钥),后续的作战计划电报报文都用新的密码本编码,保证了信息的安全传递!
输入网页域名 www.baidu.com,首先发生的是 DNS 解析,也就是将域名转换成为 IP 地址。提供这个服务的一般都是宽带运营商。
从我们的电脑到百度的服务器之间还隔了多个路由节点,其中任意一个路由不帮助我们转发消息,都有可能连接不上。
假如成功连上了百度的服务器,这个时候百度开始处理我们的请求,有可能我们请求的网址是个错误页面,或者是我们的请求导致了服务器处理异常,都有可能导致我们看不到正确的网址,而是一堆错误页面。
html:超文本标记语言
CSS:级联样式表
Javascript:一种脚本语言,主要用于前端页面的 DOM 处理
数据结构就是用来帮助程序员处理批量的数据的(主要是插入、删除、修改、查询,简称 CRUD)。
这个世界一开始并没啥数据结构,后来有了数据,数据越来越多,人们为了方便处理,也就发明了各种结构。所以每一种数据结构都是用来解决一些特定的问题的。
简单的做法就是,搜索引擎将会遍历它抓取到的所有文档,从中挑选出与关键词相关的文档,这种叫做正向索引。可是要知道,Google 现在收录的网页数目是万亿级别的,要是真像这样遍历全部文档,那估计你搜索一个关键词,要等个一年才能看到搜索结果。
那么为了加快搜索速度,需要建立相反的一个索引的列表,在爬虫抓取回一个网页后,先对它进行分词处理,然后把这些提取出来的关键词与这个网页的 ID 做一个映射,这就是倒排索引(Inverted index)。
比如我们有编号 T0-T2 的三篇文档,它们的内容分别是:T0=“it is what it is”,T1=“what is it”, T2=“it is a banana”,可以对每篇文章都先分词处理,然后统计每个词对应的文档,得到这样一个倒排索引:
当我们要搜索"what is it"时,可以直接找出这三个词索引的文档编号的并集,即 T0 和T1,这就是用倒排索引搜索关键词的基本流程。所以平时我们使用搜索引擎时,它的搜索结果并不是实时查找出来的,而是使用了?前做好的倒排索引,将关键词的索引结果合并展示出来的。
当然了,倒排索引只是搜索引擎的一个基础架构,一个单词的索引结果也会有成百上千万个,如何对这些结果进行有效的排序,让用户真正想要的搜索结果排名靠前,才是关键技术。