正排索引和倒排索引

本文介绍了倒排索引的基本概念及两种形式,并详细解释了其构建方法,包括简单法和合并法,帮助读者理解搜索引擎背后的技术原理。

倒排索引(英语:Inverted index),也常被称为反向索引置入档案反向档案,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

有两种不同的反向索引形式:

一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置。
后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建。

所谓的正排索引是从索引文档到关键词到内容,倒排索引则是相反从关键词到词频,位置,目录等信息,现在通常用于搜索的。由于互联网上的数据量无限大,不可能存储足够多的文档,所以正排索引用处不大。

有两种不同的反向索引形式:

  • 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表

  • 一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置。

​我们就能得到下面的反向文件索引:


  • {\displaystyleT_{0}=}
    "it is what it is"

  • {\displaystyleT_{1}=}
    "what is it"

  • {\displaystyleT_{2}=}
    "it is a banana"
"a":      {2}
"banana": {2}
"is":     {0, 1, 2}
"it":     {0, 1, 2}
"what":   {0, 1}

检索的条件"what", "is" 和 "it" 将对应这个集合:


coll

对相同的文字,我们得到后面这些完全反向索引,有文档数量和当前查询的单词结果组成的的成对数据。 同样,文档数量和当前查询的单词结果都从零开始。所以,"banana": {(2, 3)} 就是说 "banana"在第三个文档里 ( {\displaystyle T_{2}} T_{2}),而且在第三个文档的位置是第四个单词(地址为 3)。

"a":      {(2, 2)}
"banana": {(2, 3)}
"is":     {(0, 1), (0, 4), (1, 1), (2, 1)}
"it":     {(0, 0), (0, 3), (1, 2), (2, 0)}
"what":   {(0, 2), (1, 0)}

如果我们执行短语搜索"what is it" 我们得到这个短语的全部单词各自的结果所在文档为文档0和文档1。但是这个短语检索的连续的条件仅仅在文档1得到。

反向索引数据结构是典型的搜索引擎检索算法重要的部分。
一个搜索引擎执行的目标就是优化查询的速度:找到某个单词在文档中出现的地方。以前,正向索引开发出来用来存储每个文档的单词的列表,接着掉头来开发了一种反向索引。 正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。
实际上,时间、内存、处理器等等资源的限制,技术上正向索引是不能实现的。
为了替代正向索引的每个文档的单词列表,能列出每个查询的单词所有所在文档的列表的反向索引数据结构开发了出来。
随着反向索引的创建,如今的查询能通过立即的单词标示迅速获取结果(经过随机存储)。随机存储也通常被认为快于顺序存储。

构建方法

简单法

索引的构建[4] 相当于从正排表到倒排表的建立过程。当我们分析完网页时 ,得到的是以网页为主码的索引表。当索引建立完成后 ,应得到倒排表 ,具体流程如图所示:
流程描述如下:
1)将文档分析称单词term标记,
2)使用hash去重单词term
  3)对单词生成倒排列表
  倒排列表就是文档编号DocID,没有包含其他的信息(如词频,单词位置等),这就是简单的索引。
  这个简单索引功能可以用于小数据,例如索引几千个文档。然而它有两点限制:
  1)需要有足够的内存来存储倒排表,对于搜索引擎来说, 都是G级别数据,特别是当规模不断扩大时 ,我们根本不可能提供这么多的内存。
  2)算法是顺序执行,不便于并行处理。

合并法

归并法[4] ,即每次将内存中数据写入磁盘时,包括词典在内的所有中间结果信息都被写入磁盘,这样内存所有内容都可以被清空,后续建立索引可以使用全部的定额内存。
归并索引
归并索引
如图 归并示意图:
合并流程:
1)页面分析,生成临时倒排数据索引A,B,当临时倒排数据索引A,B占满内存后,将内存索引A,B写入临时文件生成临时倒排文件,
  2) 对生成的多个临时倒排文件 ,执行多路归并 ,输出得到最终的倒排文件 ( inverted file)。
合并流程
合并流程
索引创建过程中的页面分析 ,特别是中文分词为主要时间开销。算法的第二步相对很快。这样创建算法的优化集中在中文分词效率上。



作者:常圆
链接:http://www.jianshu.com/p/7cd23e77667a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### 正排索引倒排索引的区别及使用场景 #### 一、正排索引倒排索引的概念 正排索引是以文档 ID 为键,以文档内容或其他字段值为值的索引结构。它通常用于存储检索完整的文档信息,例如文档的标题、正文或元数据[^1]。 倒排索引是一种以词项(Term)为键,以包含该词项的文档 ID 列表为值的数据结构。通过倒排索引,可以快速定位哪些文档包含特定的词项[^2]。 #### 二、正排索引倒排索引的结构差异 - **正排索引** 正排索引的核心是以文档为中心的存储方式。每个文档都有一个唯一的标识符(如文档 ID),并且与其对应的字段值(如标题、内容等)相关联。例如: ```python forward_index = { 1: {"title": "搜索引擎", "content": "全文检索技术"}, 2: {"title": "大数据分析", "content": "分布式计算框架"} } ``` - **倒排索引** 倒排索引则是以词项为中心的存储方式。每个词项对应一个包含该词项的文档列表。例如: ```python inverted_index = { "搜索引擎": [1], "全文检索技术": [1], "大数据分析": [2], "分布式计算框架": [2] } ``` #### 三、正排索引倒排索引的优缺点 - **正排索引的优点** - 查询文档的具体内容时效率高,因为可以直接通过文档 ID 获取完整的文档信息[^1]。 - 适合需要频繁访问或更新文档字段值的场景,例如排序或聚合操作。 - **正排索引的缺点** - 在进行关键词匹配时效率较低,因为需要逐个文档扫描其内容以判断是否包含目标词项[^1]。 - **倒排索引的优点** - 高效支持基于关键词的查询操作,例如布尔查询、短语查询等。通过构建倒排列表,可以快速找到包含特定词项的文档集合[^2]。 - 支持复杂的文本搜索逻辑,例如交集、并集差集操作。 - **倒排索引的缺点** - 存储开销较大,因为需要维护词典倒排列表,并记录每个词项在文档中的位置信息[^2]。 - 更新成本较高,因为每次修改文档内容可能需要重新生成倒排索引。 #### 四、正排索引倒排索引的使用场景 - **正排索引的使用场景** - 需要频繁访问文档字段值的场景,例如按价格排序商品列表、按时间排序日志记录等。 - 聚合查询场景,例如统计某个字段的总、平均值或最大值/最小值。 - **倒排索引的使用场景** - 全文搜索场景,例如在大量文档中查找包含特定关键词的内容[^2]。 - 复杂查询场景,例如支持布尔逻辑、短语匹配或多条件组合查询。 #### 五、示例代码:构建正排索引倒排索引 以下是一个简单的 Python 示例,展示如何分别构建正排索引倒排索引: ```python from collections import defaultdict # 构建正排索引 def build_forward_index(documents): forward_index = {} for doc_id, document in enumerate(documents): forward_index[doc_id] = {"content": document} return forward_index # 构建倒排索引 def build_inverted_index(documents): inverted_index = defaultdict(list) for doc_id, document in enumerate(documents): words = document.split() for word in words: if doc_id not in inverted_index[word]: inverted_index[word].append(doc_id) return dict(inverted_index) documents = ["hello world", "hello elasticsearch", "world of search"] forward_index = build_forward_index(documents) inverted_index = build_inverted_index(documents) print("正排索引:", forward_index) print("倒排索引:", inverted_index) ``` #### 六、总结 正排索引倒排索引是两种不同的索引结构,各自适用于不同的查询需求。正排索引适合需要频繁访问文档字段值的场景,而倒排索引则更适合基于关键词的全文搜索场景。两者各有优缺点,在实际应用中可以根据具体需求选择合适的索引方式[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值