IT科技

搜索引擎之倒排索引浅析

时间:2010-12-5 17:23:32  作者:IT科技   来源:人工智能  查看:  评论:0
内容摘要:上一篇文章 ElasticSearch 术语中提到了倒排索引,那么这篇文章就来讲解下什么是倒排索引,倒排索引的数据结构以及 ElasticSearch 中的倒排索引。倒排索引倒排索引(Inverted

 上一篇文章 ElasticSearch 术语中提到了倒排索引,搜索那么这篇文章就来讲解下什么是引擎引浅倒排索引,倒排索引的排索数据结构以及 ElasticSearch 中的倒排索引。

倒排索引

倒排索引(Inverted Index) 也常被称为反向索引,搜索是引擎引浅搜索引擎中非常重要的数据结构,为什么说它重要呢,排索我们首先拿一本书《重构 改善既有代码的搜索设计》举个例子:

如果一本书没有目录的话,理论上也是引擎引浅可以读的,只是排索合上书下次再次阅读的时候,就有些耗费时间了。搜索

通过给一本书加目录页,引擎引浅可以快速了解这本书的排索大致内容分布以及每个章节的页码数,这样在查询内容的搜索时候效率就会非常高了,所以书的引擎引浅目录就是书本内容的简单索引。

目录页

想象一下你要搜索 case语句 这个关键词在这本书的排索页码,你应该怎么办呢?有些技术类的亿华云书籍会在最后提供索引页,这本书的索引页如下:

索引页

只需要从索引页中查找 case语句,就可以查找到关键词在书本中的页码位置了。

看完这个例子,让我们来把图书和搜索引擎做个简单的类比:

图书当中的目录页就相当正向索引(Forward Index),索引页就相当于倒排索引的简单实现,在搜索引擎中,正向索引指的是文档 ID 到文档内容和单词的关联,倒排索引就是单词到文档 ID 的关系。

下面来看一个很简单的例子:

如上有三篇文档,每篇文档的内容都是关于 ElasticSearch 的三本书,那我们思考下怎么样变为一个倒排索引呢?

把书中内容出现所以的词都分成不同的关键词(Term),排列在第一栏,分别是 ElasticSearch,Mastering,Server 和 Essentials;第二栏是云南idc服务商统计了关键词在所有内容中出现的次数,比如 ElasticSearch 在内容中出现了三次,就记为 3;第三栏标注的是文档 ID 和文档出现的位置,比如 ElasticSearch 在第 1,2,3 文档中都出现了,在第一个文档所处的位置是第二个,所以标注的为 1。

以上就是简单的正排索引和倒排索引的结构,下面让我们来看下倒排索引的数据结构:

倒排索引数据结构

倒排索引的核心分为两部分,第一部分为单词词典(Term Dictionary),记录所有文档的单词以及单词到倒排列表的关联关系。在前面的例子中,单词的量并不是很多,但是在实际生产中,单词量会非常大,所以实际会采用 B+ 树和哈希拉链法去存储单词的源码库词典,以满足高性能的插入与查询。

第二部分是倒排列表(Posting List),它记录了单词对应文档的结合,倒排列表是由倒排索引项(Posting) 组成,倒排索引项包含:

文档 ID:用于获取原始信息 词频(TF,Term Frequency):该单词在文档中出现的次数,用于相关性评分 位置(Position):单词在文档中分词的位置,用于语句搜索(Phrase Query) 偏移(Offset):记录单词的开始结束位置,实现高亮显示(比如用 GitHub 搜索的时候,搜索的关键词会高亮显示)

下面我们来用一张图来整体看下倒排索引:

一个倒排索引是由单词词典(Term Dictionary)和倒排列表(Posting List)组成的,单词词典会记录倒排列表中每个单词的偏移位置。比如当搜索 Allen 的时候,首先会通过单词词典快速定位到 Allen,然后从 Allen 这里拿到在倒排列表中的偏移,快速定位到在倒排列表中的位置,从而真正拿到倒排索引项 [12,15](这里只是列了下 Document ID,其实是像上面讲的包含 4 项信息的项),拿到这个项可以去索引上拿到原始信息,可以去计算打分排序返回给用户。

再了解了倒排索引的数据结构后,让我们来看下 ES 中的倒排索引吧!

ElasticSearch 倒排索引

那么在 ElasticSearch 中的文档是基于 Json 格式的,其中一个文档包含多个字段,每个字段都会有自己的倒排索引。在 Mapping 中可以去设置对某些字段不做索引,这样做可以节省存储空间,但同时也会导致这个字段无法搜索了。

比如一个文档,其中包含两个字段 username 和 job:

{     "username":"wupx",     "job":"programmer" } 

在构建索引的时候是根据字段构建的,那么 ES 中 username 会有一个倒排索引,job 也会有一个倒排索引。

总结

这篇文章主要介绍了什么是倒排索引以及它的数据结构,下一篇文章将会学习如何在 ES 中分词来形成倒排索引。

参考文献

Elasticsearch核心技术与实战

https://dwz.cn/ELv7FvuX

首先安装VNC复制代码代码如下:# apt-get install vnc4server 复制代码代码如下:root@node1:~/.vnc# vncpasswd  复制代码代码如下:root@node1:~# vncserver :1 复制代码代码如下:root@node1:~# ps -ef | grep vnc 复制代码代码如下:vncserver -geometry 1280×800 -alwaysshared :1 复制代码代码如下:vim .vnc/xstartup(假设你此时在用户根目录下) 复制代码代码如下:vncserver -kill :1其中,:1表示的创建远程桌面时的桌面号。修改分辨率:复制代码代码如下:vncserver -geometry 1280×800客户端连接客户端安装vncview,然后连接。输入IP的时候,输入 IP:NO,即ip地址加会话号,刚才开户的是1,比如这里就输入 1.1.1.1:1然后输入完密码,就可以连接了因为没有桌面环境,所以,我们需要安装一个,这里使用Xface
inux/Ubuntu系统用的时间久了,经常会有一些系统更新,除了一些系统补丁、工具补丁、工具升级之外,内核也经常对一些问题进行修改升级,这样就会产生一些新的内核,我们更新了新的内核后,就会自动帮我们添加到开机启动菜单选项中,那些旧的内核启动项,对于我们来说已经没有用了,可以删除,删除后可以让我们在开机的时候能快速的选择要启动的菜单项,同时也能清理出一些磁盘空间出来,小编下面就来分享如何删除多余的内核启动菜单项注意:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面  1、打开“应用程序”,然后在弹出菜单中点击“附件”,选择并打开“终端”,打开终端命令窗口2、在终端命令窗口中输入并执行下面的命令:uname -a,查看我们当前使用的内核,不要删除错误了,或者当我们使用的是旧内核进入系统,想删除这个内核启动项,这样也是不能删除的。只能在开机时选择别的内核启动项进入系统才能删除3、输入下面的命令,查看当前我们系统中有哪些内核启动项,同时也可以方便我们复制的操作,具体命令是:dpkg --get-selections | grep linux4、下面就开始删除内核启动项,先选择内核启动项,然后复制,这样方便操作,然后输入下面的命令:sudo apt-get remove linux-image-2.6.32.21-generic5、执行过程中会警告我们确实要执行这个操作,输入字母y,然后回车,就开始卸载旧内核了6、之后就是一些具体的卸载过程的提示,已经更新系统启动项的信息7、我们再次使用命令:dpkg --get-selections | grep linux 来查看当前的内核情况:在 linux-image-2.6.32.21-generic 后面显示deinstall,表示已经卸载了linux-headers-2.6.32.21和 linux-headers-2.6.32.21-generic是之前我们卸载的内核相关联的头文件,现在对于我们也没有用,也可以卸载了,卸载了可以帮我们清理出不少磁盘空间,具体命令是:sudo apt-get remove linux-headers-2.6.32-21sudo apt-get remove linux-headers-2.6.32-21-generic8、删除完后,再用命令:dpkg --get-selections | grep linux 查看当前内核启动选项相关信息:linux-headers-2.6.32-21 已经没有了,被删除了linux-headers-2.6.32-21-generic已经没有了,被删除了linux-image-2.6.32-21-generic 显示为deinstall,表示被卸载删除了9、 虽然在卸载旧内核的时候提示信息说已经帮我们更新了系统启动项,但为了保险起见我们执行sudo update-grub更新开机启动控制文件。
热门排行
copyright © 2025 powered by 编程之道  滇ICP备2023006006号-34sitemap