Lucene(发音为 ['lusen] )是一个非常优秀的开源的全文搜索引擎,我们可以在它的上面开发出各种全文搜索的应用来。Lucene在国外有很高的知名度,现在已经是Apache的顶级项目,在国内,Lucene的应用也越来越多。<o:p></o:p>
一.用Lucene建立索引
用lucene建立索引, Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:
1) 以投诉内容假设有数据库中有2条记录
第1条记录的投诉内容: 为什么我在经三路上接不到电话,而且我这个月的话费很高.
第2条记录的投诉内容: 我九月份的话费怎么那么高呢
2) lucene进行全文分析.获得
第1条记录的关键字:
为什么 我 经三路 接不到 电话 我 话费 高
第2条记录的关键字:
我 九月 话费 高
3)lucene进行倒排索引.关键字在那些记录中出现过.
关键字 | 对应的记录号 |
经三路 | 1 |
九月 | 2 |
高 | 1,2 |
话费 | 1,2 |
我 | 1,2 |
以”我”为例子说明一下该结构,”我”在第1条记录中存在,在第2条记录中也存在.也就是说当用户输入关键字”我”的时候可以查找到第1条记录和第2条记录.
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关键字 | 对应的记录号 | [出现频率] | 出现位置 |
经三路 | 1 | [2] | 2,6 |
九月 | 2 | [1] | 2 |
高 | 1 | [1] | 8 |
<o:p> </o:p> | 2 | [1] | 4 |
话费 | 1 | [1] | 7 |
<o:p> </o:p> | 2 | [1] | 3 |
我 | 1 | [2] | 2,6 |
<o:p> </o:p> | 2 | [1] | 1 |
以我为例子说明该结构,”我”在记录1中出项[2]次,位置在2,6,在记录2中出现[1]次位置在1.
<o:p> </o:p>
lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。为了减小索引文件的大小,Lucene对索引还使用了压缩技术。
下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
假设要查询单词 “话费”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。
4)当用户输入 [我],就可以搜索到第1条记录和第2条记录.输入[经三路]可以搜索到第1条记录.输入[话费]可以搜索到第1条记录和第2条记录.
以上是lucene的用法.