Lucene初探之如何创建索引

2/10/2017来源:ASP.NET技巧人气:2194

上一篇我们简单了解了索引是啥,为什么要创建索引以及索引里面存些什么,现在我们来看看如何去创建一个索引。

全文检索库的索引创建过程一般都是分为以下几个步骤:

First:一些要索引的原文档

我们使用以下两个文件来创建一个简单地索引,让大家可以清晰、直观地了解索引的创建过程;

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

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

Second:将原文档传递给分词组件(Tokenizer)

分词组件会对原文档进行以下几个操作,这些操作合称为Tokenize:

将文档分解为一个个独立的单词;

去掉标点符号;

去掉停词;

其中“停词”,也就是Stop Word,指代最常用、最普通的一些单词,因为出现的频次太多,并且没有什么特别的含义,所以一般情况下不会成为搜索的关键词,因此在创建索引的过程中需要过滤剔除掉这些词,以此来精简索引的存储空间。

比如英文中的停词为:“the”,“a”,“this”等。

一般情况下分词组件都会有针对不同语言的停词集合。

经过分词之后,文档会成为词元,即Token。

文件①和文件②经过分词之后,得到以下词元:

"Students","allowed","go","their","friends","allowed","drink","beer","My","firend","Jerry","went","school","see","his","students","found","them","drunk","allowed"。

Third:将分词处理后得到的词元传递给语言处理组件

相信大家看到上面得到词元之后一定会发现,这些词元中有许多单词是同一个词的不同状态,语言处理组件(Linguistic PRocessor)主要就是对得到的词元进行一些语言上的处理,使得词元中一些重复与无用的词进一步减少。

变为小写;

将单词缩减为词根,如将“students”转为“student”,这个操作被称为:Stemming;

将单词转变为词根,如将“drunk”换变为“drink”,这个操作被称为:Lemmatization。

其中,Stemming和Lemmatization有一些相同与不同之处:

相同:Stemming和Lemmatization都要词汇变为词根形式;

不同:

Stemming采用的是“缩减”方式,它有一套固定的算法来做缩减,如去掉“s”,去掉“ing”变为“e”;

Lemmatization采用的是转变方式,它是主要采用保存某种词典的方式来进行转变的,比如字典中有“drunk”到“drink”的映射,则在做转变是,只要对照词典就可以了。

Stemming和Lemmatization不是互斥的关系,它们之间也有交集,有些词可以通过两种方式都能实现转换的目的。

上文的词元经过语言处理之后得到以下的词:

"student","allow","go","their","friend","allow","drink","beer","my","friend","jerry","go","school","see","his","student","find","them","drink","allow"。

由于有了语言处理组件,我们在搜drunk时,drink也能被搜索到。

Fourth:将处理后的词传递给索引组件

索引组件(Indexer)使用得到的词进行创建词典,排序与合并,最终生成一个文档倒排链表。

1. 利用语言处理组件传递过来的词创建词典:

词典

2. 对词典按字母进行排序:

排序后词典

3. 合并相同的词成为文档倒排链表。

文档倒排链表

在此倒排链表中,有这样几个定义:

Document Frequency 即文档频次,表示总共有多少文档包含词A。

Frequency 即词频率,表示文件B中包含了几个词A。

所以对词"allow"来说,总共有两篇文档包含了它,从而词"allow"后面的文档链接一共有两项,第一项表示包含"allow"的第一篇文档,即①号文档,此文档中,"allow"出现了2次,第二项表示包含"allow"的第二个文档,是②号文档,此文档中"allow"出现了1次。

到这里,索引已经创建好了,我们可以通过它很快地找到我们想要的文档。

而且在此过程中,我们惊喜地发现,我们搜索“driven”,“driving”,"drove"都可以找到,因为在我们输入这些词进入系统之后,这些关键词也会经过语言处理组件的处理,最终成为“dirve”,从而可以搜索到我们想要的文档。

现在我们已经了解了索引的创建过程,下一篇我们将进一步了解搜索引擎是如何利用我们创建好的索引来进行搜索的。