倒排索引和普通旧索引之间有什么区别?


98

在软件工程中,我们一直在创建索引(例如,在数据库中),但我也听到很多人谈论反向索引。两者之间有根本不同吗?他们听起来像是同一件事。



要澄清一下,您在问:根据基于表中已存在的数据分解表的普通索引(en.wikipedia.org/wiki/Index_%28database%29)有何不同?那是对的吗?
jwheron 2011年

3
@guidoism每个人都没有提到的(虽然正态性通过示例部分地描述了它,而lovesh几乎在按钮上很多)是倒排索引将“基本”数据“倒置”以便更有效(例如交换密钥/从不同角度进行搜索的数据或以字母/数字顺序排序以允许使用快速搜索算法),而标准索引会在找到数据时对其进行存储。“反向/向前”引用和“反向”一词的字面含义在这里不适用,而是指数据的反向转换以产生针对当前任务的有效格式。
TheManWithNoName

Answers:


215

一种常见的用法是“ ...允许快速全文本搜索”。

这两种类型表示方向性。一个使您向前浏览索引,另一个使您向后(反向)浏览索引。而已。这里没有神秘的事物。否则,这两种类型是相同的,这只是您拥有哪些信息的一个问题,结果就是您要查找什么信息

为了解决您的问题,我认为实际上没有办法知道为什么今天的用途。定义哪个forward和哪个是重要的唯一原因inverted是,我们大家都可以就它们进行对话,并且每个人都知道我们在谈论哪个方向。考虑一下术语“左”和“右”:它们是相对的。哪一个无关紧要,除了每个人都需要同意哪个是“左”和哪个是“右”才能使单词具有含义。如果作为一种文化,我们决定向左和向右翻转,那么您将遇到同样的问题,因为自从商定的含义发生了变化,才能确定“右转”与“左转”是什么。但是,命名是任意的, 在意义上。

在您提出的“请不要仅仅定义术语”的评论中,您没有抓住要点,而我认为您只是在措辞上无所适从。


为了将来的读者受益,我现在提供几个“正向”和“反向”索引示例:

示例1:Web搜索

如果您认为索引的倒数类似于数学中的函数的倒数,其中倒数是具有不同形式的特殊事物,那么您会误会:这里不是这种情况。

在搜索引擎中,您具有文档列表(网站页面),在其中输入一些关键字并获得结果。

一个正向索引(或只是指数)的文件清单,以及这些词出现在其中。在网络搜索示例中,Google爬行了网络,建立了文档列表,弄清楚了哪些单词出现在每个页面中。

倒排索引单词的列表,以及它们出现的文件。在网络搜索示例中,您提供单词列表(您的搜索查询),然后Google生成文档(搜索结果链接)。

它们都是索引-这只是您要朝哪个方向发展的问题。转发是从文档->到->单词,反向是从单词->到->文档。

示例2:DNS

另一个示例是DNS查找(采用主机名并返回IP地址)和反向查找(采用IP地址并为您提供主机名)。

示例3:一本书

如上例所示,书后的索引实际上是倒排索引 -单词列表以及在书中找到它们的位置。在书中,目录就像一个前向索引:它是书中包含的文档(章节)列表,除了不列出这些部分中的单词,目录仅给出了名称/内容概述这些文件(章节)中包含的内容。

示例4:您的手机

手机中的前向索引是您的联系人列表,以及与这些联系人相关联的电话号码(手机,家庭,工作)。该倒排索引是什么让您手动输入电话号码,当你点击“拨号”你看这个人的名字,而不是数量,因为你的手机已经采取了电话号码,发现你与它相关的接触。


11
感谢您的时间。但是您的答案仍然无济于事。正如我在赏金要求中提到的那样,我确实了解其中涉及的含义和含义。我的问题是:“为什么在我们有着悠久的传统却称之为普通索引的情况下,命名反向索引的人为什么将它们称为反向?例如,正如您所指出的,书末的索引实际上是反向的。从历史的角度来看,书籍末尾的索引先于网络索引,然后为什么要颠覆传统呢?”。我的猜测是,这只是发生的事情之一
Manav

1
“我不知道为什么不对这些术语的使用进行历史审查就不可能知道”-我希望有人进行这样的历史审查并给出答案。:-)因为这与“索引”的通用语言含义相反,所以令人惊讶。(一个可能的答案是,当首先想到短语“ inverted index”时,短语“ index”已经是某个“ index”和“ inverted index”的倒置,即,“ index”的真实含义“。在这种情况下,知道为什么前向“索引”为何使用这个奇怪的名称会很有用。)
ShreevatsaR 2012年

2
@jefflunt只是想知道为什么要使用前向索引。我在这里特别谈论网络搜索示例。因此,如果google作为正向索引的一部分在文档中使用<->单词列表,并最终在搜索中使用单词<->文档列表,为什么在文档中使用<->单词列表他们吗?换句话说,我的问题是:一个人不能问Google特定页面(文档)中有哪些单词,或者主要是要问他/她正在寻找的关键字在页面中出现的位置。那为什么要进行前向索引编制呢?
quickbrownfox 2015年

1
那么在关系数据库的上下文中没有反向索引吗?或那些索引实际上是“反向索引”。文献中“可接受的”术语存在的问题是,很少有先驱或军团开创了不同的协议,而部分社区遵循该命名法则是无知/错误/深思熟虑。一段时间后,每个人都会感到困惑。我敢肯定,软件中有许多术语本来是要说A的,但不同的社区故意或错误地将其称为A'或B,这在语法上是不正确的。它仍然使新学习者感到困惑。
尼尔

1
@Roylee-我尚未阅读该白皮书。我认为您要问的是:“更新前向索引时是否更新反向索引?” 如果这是您的问题,那么答案是肯定的。
jefflunt

26

他们称其为“倒转”是因为已经有一个前向索引。以搜索引擎为例,它由两部分组成:第一部分是“网络爬虫和解析器”,它建立从文档到单词的索引,第二部分是搜索数据库,它建立从单词到文档的索引。由于第一个索引存在,我们自然将第二个索引称为倒排索引。

如果将书的目录(目录)命名为索引,则应将书末的索引称为“倒排索引”。或者,另一方面,您可以将TOC称为反向索引。


6
这应该是一个可以接受的答案,因为它回答了为什么我们称索引为“反向”的问题,即使这只是每个人都认为“正常索引”的含义。SQL b树索引为每个单词存储指向包含它的所有行(“文档”)的指针。在那里我们称之为“索引”。但是在搜索引擎中,我们突然将此完全相同的过程称为“倒排索引”。不是因为它根本不同,而是因为我们首先创建了一个“正向索引”(拆分文本),然后“反向”它。因此,总而言之,名称“ inverse”来自创建它的过程,而不是来自索引的最终结构。
Foo Bar

@xeranic感谢您的见解。快速提问:从反向索引文件中构建条目后,从正向索引文件中删除条目是否可行?
罗伊·李

3
我同意@FooBar。该答案应被选择为正确答案。它回答了为什么inverted index 即使我们生活中的所有正常指标都被用作了我们发明一个新术语的原因inverted
Ryan Lyu

7

通常,当谈到索引时,您的意思是为了加快应用程序的执行速度而增加了一些计算或存储了过程的结果(例如MySQL或其他RDBMS 咨询MySQL文档)。索引也可以与缓存等相关。

反向索引创建的文件结构主要用于(全文搜索)。

倒排索引由两个主要文件组成:

  • 词汇
  • 发生次数

词汇表中是从文本中提取的常用词(当然是在过滤了诸如代词之类的黑名单词之后)。出现文件保留单词和文档之间的连接(word1出现在doc1和doc2中,而不出现在doc3中)。它以矩阵形式表示。

索引过程-倒排索引

上图中显示了创建提到的两个文件的过程。

如果您对此问题有进一步的兴趣,我可以为您推荐一本由里卡多·耶德(Ricardo Yated)撰写的好书-现代信息检索(在Amazon上查看),大约200页。

希望能帮助到你 :-)


这是一个很好的答案,因为它解释了什么是倒排索引。它超越了前向索引和反向索引的思想,该思想不同于用于通过创建索引和反向索引而启用的搜索功能的算法。
AN6U5

6

正态性已经很好地区分了前向索引和反向索引,但是对于为什么一个被称为正向索引而另一个被称为反向索引的问题,也许这就是为什么它们被这样称呼的原因

以搜索引擎爬网和建立索引(或为书建立索引)为例,在您爬网(或阅读书本)或前进时,可以同时构建前向索引。因此,如果您要抓取10个网页(或一本书中的10个章节),则可以抓取第一个网页(阅读第一章),然后列出该网页中出现的单词列表(该章中出现的单词)并继续此过程适用于其他网页(其他章节),因此当您抓取所有10个网页(阅读所有10章)时,您的前向索引已完成,每个网页(章节)均指向其中包含的单词列表

但是要创建反向索引,您必须爬网所有10个网页(阅读10章),然后从每个文档列表中提取每个单词,然后找出包含该单词的文档。因此,这就像在您爬网网页(阅读本书的各章)之后向后退。因此将其称为倒排索引。

这只是我的猜测。


5

索引有很多类型。例如,B树,R树,哈希...出于不同的目的,我们必须选择正确的索引。

倒排索引是一个特殊的索引。倒排索引通常在全文搜索引擎中使用。使用倒排索引,我们可以尽快找出单词在文档(或文档集)中的位置。考虑一下内存和cpu的限制,其他索引无法完成这项工作。

您可以阅读lucene文档以获取更多详细信息。这是一个开源搜索引擎。 http://lucene.apache.org/java/docs/index.html


3

术语“倒排单词索引”是指包含多个单词的单个文档与包含(或标识)多个文档列表的每个唯一单词之间的关系变化。这实际上是采取一对多关系(文档转换为单词)并将其反转(或逆转),从而现在存在新的“反转”一对多关系,该关系是与多文件(即所有包含该词的文件)。它的起源确实如此简单,并且在计算机和电子高速索引还没有出现之前,“倒排索引”一词就被用来描述相同类型的手动索引(是的,我是一个古老的geezer程序员,几乎年龄已经足够大,可以将格蕾丝·霍珀(Grace Hopper)视为“甜美的小姐” 当COBOL是一种崭新的语言时,适合求婚的年龄)。请不要暂时丢弃我们的Geezer,因为有时我们可能会提供有用的甚至可能有价值的一两个历史记录-当我们的个人RAM仍在工作时。[咧嘴]


2

在倒排索引中,我们具有以下形式:

word1->文档列表(按顺序排列)

word2->文档列表(按排序顺序)

这对搜索引擎查询处理非常有用,因为它使我们能够找到单词中出现的文档。

您可以使用监督机器学习来构建此反向索引。


6
对我来说,这听起来像是一个索引,对此有何反感?
guidoism 2011年

2
@guidoism反向索引是前向索引的反向。前向索引存储每个文档的单词列表。例如Doc-> w1,w2
程序员,

我仍然没有发现正向索引和反向索引之间有任何区别(就其工作方式而言,请保留命名位)。对我来说,这两者看起来都像是将字段映射到一堆文档ID的索引。这就是我了解oracle btree(否则称为正向索引)如何组织数据的方式。我认为倒排索引的原理没有任何区别。在搜索方面,映射文档-> w1,w2,w3对我来说似乎是一个无效的命题。想知道为什么为什么要这样?那让我回到了平方。:-)。
user1189332 '16

@Programmer快速提问:从中建立反向索引后,从正向索引文件中删除条目是否可行?
罗伊·李

0

另一个不同之处:

与前向索引相比,使用反向索引处理更新是昂贵的。

前向索引仅通过反映相应文档索引中的更改来轻松处理更新,而在反向索引中,相同的更改必须在反向索引中的多个位置中反映出来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.