因为lucene中国有时候打不开…………我觉得这个写的很清楚,正在考虑要不要买一本lucene in action看玩玩^—^
但是我们要用的jar 是 lucene.改 吧…………hmm~~~
http://www.lucene.com.cn/rm.htm
-----------------------------------------
本文主要面向具体使用,适用于已熟悉java编程的lucene初学者。
1. Lucene的简介
1.1 Lucene 历史
org.apache.lucene包是纯java语言的全文索引检索工具包。
Lucene的作者是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金jakarta的一个子项目。
目前,lucene广泛用于全文索引/检索的项目中。
lucene也被翻译成C#版本,目前发展为Lucene.Net(不过最近好象有流产的消息)。
1.2 Lucene 原理
lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的 时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的 xml或者大数据的字符类型。
2.Lucene的下载和配置
2.1 Lucene的下载
lucene在jakarta项目中的发布主页:http://jakarta.apache.org/lucene/docs/index.html。以下主要针对windows用户,其它用户请在上面的地址中查找相关下载。
lucene的.jar包的下载(包括.jar和一个范例demo):
http://apache.oregonstate.edu/jakarta/lucene/binaries/lucene-1.4-final.zip
lucene的源代码下载:
http://www.signal42.com/mirrors/apache/jakarta/lucene/source/lucene-1.4-final-src.zip
lucene的api地址:http://jakarta.apache.org/lucene/docs/api/index.html
本文使用lucene版本:lucene-1.4-final.jar。
2.2 lucene的配置
首先请确定你的机子已经进行了java使用环境的基本配置,即确保在某个平台下能够运行java源代码,否则请查阅相关文档进行配置。
接下来进入lucene的配置:
普通使用者:在环境变量的CLASSPATH中添加lucene的位置。比如:“D:"java "lucene-1.4-final"lucene-1.4-final.jar;”。
jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”进行添加。
Jsp使用者:也可以直接将lucene-1.4-final.jar文件放到"WEB-INF"classes下。
3. Lucene 的范例(Demo )
3.1 Demo说明
可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4- final中包括对普通文件和html文件的两种索引,XMLIndexingDemo针对xml文件的索引。他们的区别主要在于:对普通文件进行索引时 只要对文件的全文进行索引,而针对html、xml文件时,对标签类型不能进行索引,在实现上:html、xml的索引需要额外的数据流分析器,以分析哪 些内容有用哪些无用。因此,在后两者实现上,索引的时间额外开支,甚至超过索引本身时间,而检索时间没有区别。
以上Demo中,lucene-demos-1.4-final自带于lucene-1.4-final.zip中,XMLIndexingDemo的下载地址:
http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/
3.2 Demo的运行
首先将demo.jar的路径添加如环境变量的CLASSPATH中,例如:“D:"java"lucene-1.4-final" lucene-demos-1.4-final.jar;”,同时确保已经添加lucene-1.4-final.jar。
然后进行文件的全文索引,在dos控制台中,输入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路径为所要进行索引的文件夹,例如:“java org.apache.lucene.demo.IndexFiles c:"test”。
接着对索引进行检索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后输入检索词,程序将进行检索列出检索得到的结果(检索词出现的文件路径)。
其他Demo的运行请参考"docs"demo.html。
在运行Demo后请阅读Demo的源代码以便深入学习。
4. 利用Lucene进行索引
进行lucene的熟悉后,我们将学习如何使用Lucene。
一段索引的应用实例:
//需要捕捉IOException异常
//建立一个IndexWriter,索引保存目录为“index”
String[] stopStrs = {
"他奶奶的", "***"};
StandardAnalyzer analyzer = new StandardAnalyzer(stopStrs);
IndexWriter writer = new IndexWriter("index", analyzer, true);
//添加一条文档
Document doc = new Document();
doc.add(Field.UnIndexed("id", "1"));//“id”为字段名,“1”为字段值
doc.add(Field.Text("text", "***,他奶奶的,入门与使用"));
writer.addDocument(doc);
//索引完成后的处理
writer.optimize();
writer.close();
看完这段实例后,我们开始熟悉lucene的使用:
4.1 Lucene的索引接口
在学习索引的时候,首先需要熟悉几个接口:
4.1.1分析器Analyzer
分析器主要工作是筛选,一段文档进来以后,经过它,出去的时候只剩下那些有用的部分,其他则剔除。而这个分析器也可以自己根据需要而编写。
org.apache.lucene.analysis.Analyzer:这是一个虚构类,以下两个借口均继承它而来。
org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最简单拉丁语言。
org.apache.lucene.analysis.standard.StandardAnalyzer:标准分析器,除了拉丁语 言还支持亚洲语言,并在一些匹配功能上进行完善。在这个接口中还有一个很重要的构造函数:StandardAnalyzer(String[] stopWords),可以对分析器定义一些使用词语,这不仅可以免除检索一些无用信息,而且还可以在检索中定义禁止的政治性、非法性的检索关键词。
4.1.2 IndexWriter
IndexWriter的构造函数有三种接口,针对目录Directory、文件File、文件路径String三种情况。
例如IndexWriter(String path, Analyzer a, boolean create),path为文件路径,a为分析器,create标志是否重建索引(true:建立或者覆盖已存在的索引,false:扩展已存在的索引。)
一些重要的方法:
接口名
|
备注
|
addDocument(Document doc)
|
索引添加一个文档
|
addIndexes(Directory[] dirs)
|
将目录中已存在索引添加到这个索引
|
addIndexes(IndexReader[] readers)
|
将提供的索引添加到这个索引
|
optimize()
|
合并索引并优化
|
close()
|
关闭
|
IndexWriter为了减少大量的io维护操作,在每得到一定量的索引后建立新的小索引文件(笔者测试索引批量的最小单位为10),然后再定期将它们 整合到一个索引文件中,因此在索引结束时必须进行wirter. optimize(),以便将所有索引合并优化。
4.1.3 org.apache.lucene.document
以下介绍两种主要的类:
a)org.apache.lucene.document.Document:
Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型(详细见b)。Document的几种接口:
接口名
|
备注
|
add(Field field)
|
添加一个字段(Field)到Document中
|
String get(String name)
|
从文档中获得一个字段对应的文本
|
Field getField(String name)
|
由字段名获得字段值
|
Field[] getFields(String name)
|
由字段名获得字段值的集
|
b)org.apache.lucene.document.Field
即上文所说的“字段”,它是Document的片段section。
Field的构造函数:
Field(String name, String string, boolean store, boolean index, boolean token)。
Indexed:如果字段是Indexed的,表示这个字段是可检索的。
Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。
Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变 过程tokenization中,Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句(例如:a,the,they等,详见 org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和 org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。Token是索引时候的基本单元,代表一个被索引的词,例如一个英文单词,或者一个汉字。因此,所有包含中文的文本都必 须是Tokenized的。
Field的几种接口:
Name
|
Stored
|
Indexed
|
Tokenized
|
use
|
Keyword(String name,
String value)
|
Y
|
Y
|
N
|
date,url
|
Text(String name, Reader value)
|
N
|
Y
|
Y
|
short text fields:
title,subject
|
Text(String name, String value)
|
Y
|
Y
|
Y
|
longer text fields,
like “body”
|
UnIndexed(String name,
String value)
|
Y
|
N
|
N
|
UnStored(String name,
String value)
|
N
|
Y
|
Y
|