布尔检索和倒排索引的实验:
1. 掌握倒排索引(reverted index)的建立过程
2. 掌握倒排记录表(postings lists)的合并算法
倒排索引(reverted index)的建立过程
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
词项(term)是索引的单位,它通常可以用词来表示。每个词项都有一个记录出现该词项的所有文档的列表,该表中的每个元素记录的是词项在某文档中的一次出现信息,这个表中的每个元素通常称为倒排记录(posting)。每个词项对应的整个表称为倒排记录表(posting list)或倒排表(invertedlist)。所有词项的倒排记录表一起构成全体倒排记录表(postings)。
简单法
流程描述如下:
1)将文档分析称单词term标记,
2)使用hash去重单词term
3)对单词生成倒排列表
倒排列表就是文档编号DocID,没有包含其他的信息(如词频,单词位置等),这就是简单的索引。
这个简单索引功能可以用于小数据,例如索引几千个文档。然而它有两点限制:
1)需要有足够的内存来存储倒排表,对于搜索引擎来说, 都是G级别数据,特别是当规模不断扩大时 ,我们根本不可能提供这么多的内存。
2)算法是顺序执行,不便于并行处理。
一个简单的小例子,现有两个文档,分别命名为1.txt和2.txt,1.txt中的内容为:
I did enact Julius Caesar:I was killed i’ the Capitol;Brutus killed me.
2.txt中的内容为:
So let it be with Caesar.The noble Brutus hath told you Caesar was ambitious:
下图将让你对倒排索引有简单的认识
通过排序和合并建立倒排索引的过程。每篇文档的所有词项加上文档ID(图左部)通过按照字母
顺序排序(图中部)。然后,同一词项进行合并。最后,将词项和文档ID 分开(图右部)。词项存
储在词典中,每个词项有一个指针指向倒排记录表。词典中往往还会存储一些其他的概要信息,
如这里所存储的每个词项的文档频率。这个信息可以用于提高查询执行时的时间效率,也会应用
于后面要讨论的结果排序中的权重计算方法。每个倒排记录表存储了词项出现的文档列表,也可
以存储一些其他信息,比如词项频率(term frequency,即词项在文档中出现的次数)和词项在文
档中出现的位置。
package test1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
class DictNode{