天天看点

lucene3.x核心类介绍

:) [b]索引核心类[/b] :o

[b]Directory[/b]:描述Lucene索引存放的位置,是一个抽象类,由子类负责指定索引存在位置:内存或者磁盘;

[b]IndexWrite[/b]r:负责创建或者打开新索引,以及对索引做增删改操作;

[b]Analyzer[/b]:文本文件在被索引前需要经过它进行分析,把它的对象在IndexWriter构造时传入,是抽象类;Analyzer 是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、 “the”,中文中的 “的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。

分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。

[b]Document[/b]:文档对象代表一些域的集合;用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。

[b]Field[/b]:每个域都有域名和对应的域值;一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。

Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:

还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

[b]tocken: [/b]tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。

[b]segment: [/b]添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。

:roll: [b]搜索核心类[/b] :oops:

[b]IndexSearcher[/b]:以只读的方式打开索引,需要Directory(指出索引位置)构造出来;

[b]Term[/b]:搜索时候基本单元,由域名和域值组成,类似于field;term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

[b]Query[/b]:查询抽象类,有许多具体的子类实现,如TermQuery;

[b]TermQuery[/b]:匹配指定域中包含特定项的文档;

[b]TopDocs[/b]:一个简单的指针日期,指向前N个排名的搜索结果。

继续阅读