正排索引与倒排索引(转)

正排索引与倒排索引

什么是正排索引(forward index)?

由key查询实体的过程,是正排索引.

在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID。简单的,正排索引可以理解为(文件内容会对应一个分词后的集合list<< item >>) Map< id,list< item>>,能够由id快速(时间复杂度O(1))找到内容的一个数据结构。

什么是倒排索引(inverted index)?

由item查询key的过程,是倒排索引。

倒排索引可以理解为Map< item, list< id>>,能够由查询词快速(时间复杂度O(1))找到包含这个查询词的文件的数据结构。

举例:
文档编号(id) 文档内容
1 我喜欢数学
2 我喜欢编程
3 我考试数学成绩很好
4 编程太难了

分词之后的正排索引Map< id, list< item>>

文档编号(id) 分词后的集合(list< item>)
1 {我,喜欢,数学}
2 {我,喜欢,编程}
3 {我,考试,数学,成绩,很好}
4 {编程,太难了}

分词后倒排索引

  • 简单的倒排索引Map< item,list< id>>
编号 单词(item) 倒排列表(list< id>)
1 1,2,3
2 喜欢 1,2
3 数学 1,3
4 编程 2,4
5 考试 3
6 成绩 3
7 很好 3
8 太难了 4
  • 有单词频率信息(TF)的倒排索引Map< item,list< (id;TF)>>

    在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息,即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,将其记录在倒排列表中,以方便后续排序时进行分值计算。

编号 单词(item) 倒排列表(list< (id;TF)>);
1 (1;1),(2;1),(3;1)
2 喜欢 (1;1),(2,1)
3 数学 (1;1),(3;1)
4 编程 (2;1),(4;1)
5 考试 (3;1)
6 成绩 (3;1)
7 很好 (3;1)
8 太难了 (4;1)
  • 有单词频率和出现位置(pos)信息的倒排索引Map< item,list<(id;TF;< pos>)>>
编号 单词(item) 倒排列表(list<(id;TF;< pos>)>);
1 (1;1;<1>),(2;1;<1>,(3;1;<1>)
2 喜欢 (1;1;<2>),(2;1;<2>)
3 数学 (1;1;<3>),(3;1;<3>)
4 编程 (2;1;<3>),(4;1;<1>)
5 考试 (3;1;<3>)
6 成绩 (3;1;<4>)
7 很好 (3;1;<5>)
8 太难了 (4;1;<2>)

检索过程?

简单来讲:先分词,再找到每个item对应的list< id>,最后进行集合求交集的过程。
分词和倒排查询时间复杂度都是O(1),整个搜索的时间复杂度取决于“求list< id>的交集”,因此实际上问题也变成了求两个集合的交集。

原文地址:https://www.cnblogs.com/wangbin/p/10451211.html

时间: 2024-11-09 07:36:21

正排索引与倒排索引(转)的相关文章

后端程序员之路 35、Index搜索引擎实现分析4-最终的正排索引与倒排索引

# index_box 提供搜索功能的实现- 持有std::vector<ITEM> _buffer; 存储所有文章信息- 持有ForwardIndex _forward_index;    - _forward_index.build_findex( _buffer )    - get_all_items _forward_index.get_all_items    - get_items _forward_index.get_items(docid_vect, result, filt

正排索引和倒排索引简单介绍

在搜索引擎中,数据被爬取后,就会建立index,方便检索. 在工作中经常会听到有人问,你这个index是正排的还是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些简单的介绍. 网页A中的内容片段: Tom is a boy. Tom is a student too. 网页B中的内容片段: Jon works at school. Tom's teacher is Jon. 正排索引: 正排索引是指文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所

夺命雷公狗—玩转SEO---51---建库,正排索引与倒排索引和浅入关键词密度

搜索引擎其实和我们书本上的目录原理是一样的,书本上我们是可以通过目录找到我们相应的内容, 比如导航站其实也就是一个索引的结构: 正排索引: 网站001   =   关键词A  +   关键词B   如此类推...... 网站002   =   关键词A  +   关键词B   如此类推...... 像这种页面被分成一个个的关键词就是正排索引 倒排索引: 1.文档 就像一个网站,里面分成一个个文件(如 TXT.RAR.JS.CSS.EXE.JPG),这就称呼为文档 2.文档集合 有很多的文档组成的

es倒排索引和正排索引

搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values.在建立索引的时候,一方面会建立倒排索引,以供搜索用:一方面会建立正排索引,也就是doc values,以供排序,聚合,过滤等操作使用.doc values是被保存在磁盘上的,此时如果内存足够,os会自动将其缓存在内存中,性能还是会很高:如果内存不足够,os会将其写入磁盘上. 倒排索引举例:doc1: hello world you and

16 doc values 【正排索引】

搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立倒排索引,以供搜索用:一方面会建立正排索引,也就是doc values,以供排序,聚合,过滤等操作使用 doc values是被保存在磁盘上的,此时如果内存足够,os会自动将其缓存在内存中,性能还是会很高:如果内存不足够,os会将其写入磁盘上 向index中存储的文档 PUT /cc_article/long

Elasticsearch系列---相关性评分算法及正排索引

概要 上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势. 评分算法 Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先用boolean model将匹配的文档挑选出来,然后再运用评分函数计算相关度,参与的函数如我们提到的TF/IDF.Length Norm等,再加上一些控制权重的参数设置,得到最后的评分. Boolean Model 作为全文搜索的基础,Boolean Model的结果决定文档是否要进行下一步的评分

【搜索引擎(二)】索引、倒排索引、哈希表、跳表

索引 其实在计算机中我们早已接触过跟索引有关的东西,比如数据库里的索引(index),还有硬盘文件系统中其实也有类似的东西,简而言之,索引是一种为了方便找到自己需要的东西而设计出来的条目,你可以通过找索引找到自己想要内容的位置.索引过程是: 关键字->索引->文档.在图书馆内的书分门别类,就是一种按类别来分的索引.当然索引还有很多其他的实现. 仅仅有索引的概念是不够的.虽然分门别类是一种方法,但是我们在拥有一堆文档的时候必须要有从文档到索引的规范过程,并且索引的结构要满足能够让人(或者计算机)

bitmap、Trie、数据库索引、倒排索引、外排序、Mapreduce

Bitmap 问题给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?方案1:用位图/Bitmap的方法,申请512M的内存,一个bit位代表一个unsigned int值.读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在. 还可以扩展成2-Bitmap. Trie树 问题:有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能

MapReduce-倒排索引

环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境 数据:任意数量.格式的文本文件(我用的四个.java代码文件) 方案目标: 根据提供的文本文件,提取出每个单词在哪个文件中出现了几次,组成倒排索引,格式如下 Ant FaultyWordCount.java : 1 , WordCount.java : 1 思路: 因为这个程序需要用到三个变量:单词.文件名.出现的频率,因此需要自定义Writable类,以单词为key,将文件名和出现的频率打包. 1.先将每行文本的单