如何创建索引

全文检索的索引创建过程一般有以下几步:
第一步:一些要索引的原文档(Document)。 为了方便说明索引创建过程,这里特意用两个文件为例:

文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.

文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.

第二步:将原文档传给分词组件(Tokenizer)。

分词组件(Tokenizer)会做以下几件事情( 此过程称为Tokenize) :

  1. 将文档分成一个一个单独的单词。

  2. 去除标点符号。

  3. 去除停词(Stop word) 。

所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。

英语中停词(Stop word)如:“the”,“a”,“this”等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。

经过分词(Tokenizer) 后得到的结果称为词元(Token) 。 在我们的例子中,便得到以下词元code:“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”[/code]第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。

语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。对于英语,语言处理组件(Linguistic Processor) 一般做以下几点:

  1. 变为小写(Lowercase) 。

  2. 将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming 。

  3. 将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。

语言处理组件(linguistic processor)的结果称为词(Term) 。 在我们的例子中,经过语言处理,得到的词(Term)如下:“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。

第四步:将得到的词(Term)传给索引组件(Indexer)。
索引 组件(Indexer)主要做以下几件事情: 1. 利用得到的词(Term)创建一个字典。 在我们的例子中字典如下:

对字典按字母顺序进行排序。

  1. 合并相同的词(Term) 成为文档倒排(Posting List) 链表。

在此表中,有几个定义:

Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)。

Frequency 即词频率,表示此文件中包含了几个此词(Term)。

所以对词(Term) “allow”来讲,总共有两篇文档包含此词(Term),从而词(Term)后面的文档链表总共有两项,第一项表示包含“allow”的第一篇文档,即1号文档,此文档中,“allow”出现了2次,第二项表示包含“allow”的第二个文档,是2号文档,此文档中,“allow”出现了1次。到此为止,索引已经创建好了,我们可以通过它很快的找到我们想要的文档。

而且在此过程中,我们惊喜地发现,搜索“drive”,“driving”,“drove”,“driven”也能够被搜到。

因为在我们的索引中,“driving”,“drove”,“driven”都会经过语言处理而变成“drive”,在搜索时,如果您输入“driving”,输入的查询语句同样经过我们这里的一到三步,从而变为查询“drive”,从而可以搜索到想要的文档。