Lucene 简介
简介
Lucene 是一个apache软件基金会的基于Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
Lucene提供了一组简单却足够强大的核心API,只需要最小限度地理解全文索引和搜索。你只须学习它的几个类从而把Lucene集成到一个应用程序中。因为Lucene是一个Java库,它并不限定要索引和搜索的内容,这使得它比其它一些搜索程序更具有优势。
目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化为文本,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。
对于搜索,按被搜索的资源类型,分为两种:可以转为文本的、多媒体类型。全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。关于全文检索,我们要知道:1,只处理文本。2,不处理语义。3,搜索时英文不区分大小写。4,结果列表有相关度排序。
全文检索不同于数据库的SQL查询(like "%abc%"),SQL查询匹配结果不同,数据库索引不起作用,查出的结果没有相关度排序,速度慢于全文检索。(一页一页翻书和根据目录查书的区别)
反向索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率]。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。
关键的包
- org.apache.lucene.document 这个包提供了一些为封装要索引的文档所需要的类,比如 Document, Field。这样,每一个文档最终被封装成了一个 Document 对象。
- org.apache.lucene.analysis 这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。
- org.apache.lucene.index 这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。
- org.apache.lucene.search 这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。
示例 http://rwg109.iteye.com/blog/840630
IndexWriter的addDocument(doc):把Document添加到索引库中(把文档存到索引库中,并自动指定一个内部编号,用来唯一标识这条数据。内部编号类似于这条数据的地址,在索引库内部的数据进行调整后,这个编号就可能会改变,同时词汇表中引用的编号也会做相应改变,以保证正确),把文本中的词找出并放到词汇表中,建立与文档的对应关系(用到了Analyzer(分词器),作用是把一段文本中的词按规则取出所包含的所有词)。
查询过程:
把要查询字符串转为Query对象(使用QueryParser,或使用MultiFieldQueryParser,搜索时使用的Analyzer要与建立索引时使用的Analzyer要一致,否则可能搜不出正确的结果)。-----> 调用IndexSearcher.search(),进行查询,得到结果(返回值为TopDocs,是包含结果的多个信息的一个对象。ScoreDoc数组是代表一个结果的相关度得分与文档编号等信息的对象。) ----->取出要用到的数据列表(IndexSearcher.doc(scoreDoc.doc)以取出指定编号对应的Document数据)