常用的索引方式 - 倒排索引、后缀数组

倒排索引:(Inverted index)也称为反向索引、置入档案或反向档案

倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

倒排索引建立的是一种“单词到文档”的映射关系。即记录下每个单词或短语在文档中出现的位置,查找时即可直接定位到具体文档。

因为在日常的检索中,通常都是按照关键字进行搜索的,所以,倒排索引可以更好地适合这种检索机制的需要。




后缀数组:(Suffix Array)

 

 

 

字符集 一个字符集∑是一个建立了全序关系的集合,也就是说,∑中的任意两个不同的元素α和β都可以比较大小,要么α<β,要么β<α(也就是α>β)。字符集 ∑中的元素称为字符。
字符串 一个字符串S是将n个字符顺次排列形成的数组,n称为S的长度,表示为len(S)。S的第i个字符表示为S[i]。
子串 字符串S的子串S[i..j],i≤j,表示S串中从i到j这一段,也就是顺次排列S[i],S[i+1],...,S[j]形成的字符串。
后缀 后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串S的从i开头的后缀表示为Suffix(S,i),也就是Suffix(S,i)=S[i..len(S)]。
 

     下面我们约定一个字符集∑和一个字符串S,设len(S)=n,且S[n]='$',也就是说S以一个特殊字符'$'结尾,并且'$'小于∑中的任何一个字 符。除了S[n]之外,S中的其他字符都属于∑。对于约定的字符串S,从位置i开头的后缀直接写成Suffix(i),省去参数S。

     后缀数组 后缀数组SA是一个一维数组,它保存1..n的某个排列SA[1],SA[2],...SA[n],并且保证 Suffix(SA[i])<Suffix(SA[i+1]),1≤i<n。也就是将S的n个后缀从小到大进行排序之后把排好序的后缀的开头 位置顺次放入SA中。


     后缀数组的检索

由于后缀数组中的索引点是按照语法顺序存储的,所以后缀数组的检索思想是对其进行二分查找。例如查找以“text”开头的后缀,先确定两个边界模式P1=“text”、P2=“texu”,对这两个模式进行二分查找,其查找结果对应后缀数组中的两个位置,这两个位置之间的所有位置就是所要查询的结果。

然而,后缀数组是一种存储于硬盘上的大型数据结构(类似于倒排表),一次查询logn次的随机硬盘读取是不可能接受的,所以后缀数组的检索通常是从上部索引开始,先通过对内存中上部索引的二分查找确定查找结果的后缀数组范围,再将这段后缀数组加载到内存中进行进一步的二分查找以确定结果。

但在对后缀数组的二分查找过程中,需要随机访问位置点文本已进行二分查找中的比较,如果加载到内存中的后缀数组长度为m,那么一次检索需要logm次的硬盘随机访问,个人认为可以构造后缀片段更长的硬盘级别上部索引,当加载后缀数组时同时加载其对应上部索引以加快查找速度。

 

References : 

信息检索的关键问题——索引和搜索

后缀数组

Brief Introduction to Suffix Array

posted on 2008-11-14 09:29  phishine  阅读(1620)  评论(0编辑  收藏  举报

导航