11.2.2 倒排索引结构

Lucene使用的是倒排索引文件结构,倒排索引源于实际应用中需要根据属性的值来查找记录,这种索引表中的每一项都包含一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而它被称为倒排索引(Inverted Index)。

下面通过一个简单的例子来说明什么是倒排索引。假设有两篇文章,它们的内容如下:

  1. 文章1的内容:Liufeng lives in Guizhou,I live in Guizhou too.
  2. 文章2的内容:He once lived in Xinjiang.

Lucene是基于关键词进行索引和检索的,因此要先取出这两篇文章中的关键词,需要对文章进行如下处理:

1)分词:两篇文章的内容都是英文的,直接通过空格就能找出所有单词。如果是中文分章,就要使用专业的分词器进行处理。

2)过滤停用词:英文中的"in"、"too"、"once"等单词没有实际意义,通常被称作停用词。停用词的使用频率很高,但对搜索的贡献却非常小,甚至还会降低搜索效率,通常会将停用词过滤掉。中文中的“的”、“又”、“也”等也是停用词。

3)统一大小写:用户在查询"he"时,通常也希望将包含"He"、"HE"的文章也找出来,因此要统一单词的大小写。

4)统一时态:用户在查询"live"时,通常也希望将包含"lives"、"lived"的文章也找出来,因此要统一单词的时态。

在Lucene中,分词工作均是由Analyzer类完成。经过上述处理后,两篇文章包含的关键词信息如下:

  1. 文章1的关键词:[liufeng] [live] [guizhou] [i] [live] [guizhou]
  2. 文章2的关键词:[he] [live] [xinjiang]

上面是文章与关键词的对应关系,能够方便地通过文章查找所包含的关键词。倒排索引是将对应关系颠倒过来,方便通过关键词查找文章,倒排索引结构如下:

  1. 关键词 文章号
  2. guizhou 1
  3. he 2
  4. I 1
  5. liufeng 1
  6. live 1,2
  7. xinjiang 2

通常仅知道关键词在哪些文章中出现还不够,还需要知道关键词在文章中出现的次数(词频)和出现的位置。加上词频和位置以后的索引结构如下:

  1. 关键词 文章号 [出现频率] 出现位置
  2. guizhou 1 [2] 36
  3. he 2 [1] 1
  4. i 1 [1] 4
  5. liufeng 1 [1] 1
  6. live 1 [2] 25
  7. 2 [1] 2
  8. xinjiang 2 [1] 3

以上就是Lucene索引结构中最核心的部分。请注意,索引结构中的关键词是按字符顺序进行排列的,因此,Lucene可以用二元搜索算法快速定位关键词。