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.3
1.lucene原理:
lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的xml或者大数据的字符类型。
2.例子使用
lucene有两个jar包一个是lucene-1.4.3.jar 一个是lucene-demos-1.4.3.jar
将其加在classpath上就可以了。
可以通过demo对文件进行全文索引。
输入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路径为所要进行索引的文件夹,例如:“java org.apache.lucene.demo.IndexFiles c:/test”即可将test包里所有的文本进
行全文索引。
接着对索引进行检索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后输入检索词,程序将进行检索列出检索得到的结果(检索词出现的文件路径)非常方便。
查看例子的源代码IndexFiles的主要执行的是下面的语句:
Date start = new Date();
try
{
//建立一个IndexWriter,索引保存目录为“index”
IndexWriter writer = new IndexWriter("index",new StandardAnalyzer(), true);
indexDocs(writer, new File(args[0])); //遍历输入的路径下的所有的 将文档写入索引
writer.optimize();
writer.close();
Date end = new Date();
System.out.print(end.getTime() - start.getTime());
System.out.println(" total milliseconds");
}
catch (IOException e)
{
System.out.println(" caught a " + e.getClass() +
"/n with message: " + e.getMessage());
}
SearchFiles类主要实现了一下的内容:
Searcher searcher = new IndexSearcher("index");
Analyzer analyzer = new StandardAnalyzer();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Query: ");
String line = in.readLine();
if (line.length() == -1)
break;
Query query = QueryParser.parse(line, "contents", analyzer);
System.out.println("Searching for: " + query.toString ("contents"));
//查询的结果为hits对象,通过调用它对结果集进行操作。。。
Hits hits = searcher.search(query);
System.out.println(hits.length() + " total matching documents");
…………
运行LuceneWeb例子
首先部署luceneweb应用到jsp容器中。
其次建立lucene的索引文件。
格式为:IndexHTML [-create] [-index <index>] <root_directory>
参数含义:[-create] 表示重新建立索引文件(第一次,该参数必须)
[-index <index>] 索引文件存放位置(任意)
<root_directory> 用于创建索引文件的源文件位置(相对路径)
注:1)只对.html .htm .txt文件作为数据源进行索引文件的创建
2)因为该例子是web应用,所以设置<root_directory>路径时应注意,CMD下的相对路径和web应用下search.jsp的相对路径要相同。就必须在cmd下进入该search.jsp所在目录执行IndexHTML.
cd luceneweb
java org.apache.lucene.demo.IndexHTML -create -index d:/lucenedb ../examples
第三:修改configuration.jsp文件中索引文件存放目录String indexLocation = "d:/lucenedb";
第四:如果搜索关键字为中文,还需修改results.jsp中获取表单的参数语句。进行编码转换。将queryString =request.getParameter("query"); 替换为
queryString = new String(request.getParameter("query").getBytes("iso8859-1"));
第五步:http://localhost:8080/luceneweb/执行搜索就可以了