Lucene学习文档
索引
何谓索引:
1.从理论的角度理解:索引时一个单独的、物理的数据结构,它是某个表中一列或若干列值的集合、和相应的 指向表中物理标识这些值的 数据页的 逻辑指针清单。
2.从通俗的角度理解: 如果以上暂时不能理解,那你可以认为这也是一个单一的数据库,为了提高检索速度或其他原因,新建的一个简单的数据存储空间。
建立索引的优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和 排序的时间。
索引的缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
Lucene简介:
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Eclipse的帮助系统的搜索功能,就是基于Lucene。它的原作者名为Doug Cutting。
Lucene优劣:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
Lucene缺点:
如同所有的索引一样,占用磁盘空间,对数据量少、数据变化快的数据源建立索引,需动态维护、降低了速度,加大了资源占用.
|
全文搜索 |
数据库 |
索引 |
对文建立关键字索引 |
无法使用索引进行like查询 |
匹配效果 |
进行单词匹配,例如:“ant”不会匹配“planting” |
“ant”会匹配“planting” |
匹配度 |
有匹配度算法,匹配度从高到低。 |
没有 |
可定制性 |
容易定制索引规则 |
无法定制 |
理解核心索引类
在Indexer 类中可见,你需要以下类来执行这个简单的索引过程:
IndexWriter
Directory
Analyzer
Document
Field
1, IndexWriter 建立索引的中心组件。这个类可以创建一个新的索引或者打开已有的索引。就是可以进行写入操作,但是不能进行读取操作或搜索。
2, Directory 代表一个Lucene索引位置。它是一个抽象类,子类有:FSDirectory(磁盘索引位置),RAMDirectory(内存索引,在关闭时销毁)。
3, Analyzer 在IndexWriter构造函数中指定。对文本进行关键词提取,并取到其他内容。所以,不是文本的内容必须先转换成文本。有输入过滤的作用。
4, Document 一个Document 代表字段的集合。Lucene只用来处理文本,Lucene的核心只能用来处理java.lang.String和java.io.Reader。在我们的Indexer 中,我们处理文本文件,所以对我们找出的每个文本文件,创建一个Document类的实例,用Field(字段)组装它,并把这个Document 添加到索引中,完成对这个文件的索引。
5, Field 在索引中每个Document含有一个或多个Field类。每个字段相应于数据的一个片段,将在查询的时候重新获取。
理解核心搜索类
Lucene 提供的基本搜索接口和索引的一样直接。只需要几个类来执行基本的搜索操作:
IndexSearcher
Term
Query
TermQuery
Hits
1, IndexSearcher 用来进行搜索,而IndexWriter是用来建立索引。
索引文件夹/tmp/index,数据片段对应的字段“contents”,查找“lucene”字段。
2, Term 搜索的基本单元,和Field相对应。
3, Query 是最基本的抽象父类。
4, TermQuery TermQuery 是Lucene支持的最基本的查询类型,并且它也是最原始的查询类型之一。
5, Hits Hits 类是一个搜索结果文档队列指针的容器。
其它类似的搜索产品
Egothor,Namazu。。。
理解创建索引过程
1, 转化成文本。由于Field总是接收String类型或Reader类型,所以都要转化成文本。
2,分析。一旦你准备好了要索引的数据并创建了由 Field 组成的Lucene Document,你就可以调用IndexWriter的addDocument(Document)方法,把你的数据送入Lucene 索引。当你做这些时,Lucene 首先分析这些数据以使它更适合索引。它将文本数据分割成块或单词,并执行一些可选择的操作。例如,单词可以在索引之前转化为小写,以保证搜索是大小写无关的。典型的,它也有可能排除转入中所有经常出现但无意义的词,例如英语终止词(a, an, the, in, on 等等)。类似的,通常分析输入单词以获取它的本质。
这个非常重要的步骤称为分析。Lucene 的输入能够以很多有趣且有用的方法进行分析,目前,把这个步骤想像为一个过滤器。
3,写索引。在分析完成后,就可以添加到索引中间去了。Lucene是将输入存储到反向索引的数据结构中去。