之前利用Lucene+Heritrix,构建了一个简单的专利搜索引擎。不过当初对Lucene内部实现一无所知,知其然而不知其所以然。既然Lucene是Apache下的开源工具包,那么不分析一下源码总觉得有些可惜。事实上,我对Java也是半吊子,有些知识了解的也不详细,于是一边查资料一边分析。所以分析的不一定好,也不一定正确。欢迎内行指正。
【Lucene源码下载连接】:http://archive.apache.org/dist/lucene/java/这里可以找到名为Lucene-2.0.0-src的压缩文件,即2.0.0版本源码。截至本文发表日期,最新版本是2011年9月13日发布的3.4.0版本。至于为什么要分析2.0.0版而不是3.4.0版,是因为版本越靠前越靠近Lucene的的核心,再者鉴于我的实际水平,所以先从2.0.0版本开始分析。以后随着对Lucene认识的加深,再分析更高版本吧。好了,首先给一个简单的Lucene范例。
注:在建立Java工程的时候,需要引入Lucene2.0.0版本的工具包,可在Lucene源码下载地址中找到名为Lucene-2.0.0的压缩文件,下载解压后将名为Lucene-core-2.0.0的jar包引入工程。
package com.threereading;import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery;public class HelloWorld {public static void main(String[] args) { // TODO Auto-generated method stub String mtext="This is the text to be indexed."; //索引的存储路径 String index_path="E:\\index"; //创建文本内容Field Field mfield= new Field("textcontent",mtext,Field.Store.YES,Field.Index.TOKENIZED); //创建一个Document Document mdoc=new Document(); //把文本内容Field加入到Document中 mdoc.add(mfield); try { //创建一个IndexWriter实例 IndexWriter indexwriter= new IndexWriter(index_path,new StandardAnalyzer(),true); //向索引中加入Document对象 indexwriter.addDocument(mdoc); indexwriter.close();//初始化一个IndexSearcher IndexSearcher indexsearcher=new IndexSearcher(index_path); //构建一个Term对象 Term term=new Term("textcontent","text"); //构建一个Query对象 Query query=new TermQuery(term); //检索 Hits hits=indexsearcher.search(query); //输出查询结果 for(int i=0;i<hits.length();i++) System.out.println(hits.doc(i)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行程序,输出结果为:
Document<stored/uncompressed,indexed,tokenized<textcontent:This is the text to be indexed.>>
通过此程序,我们可以发现,为了使用Lucene,一个应用程序一般需要:
1、通过Field来创建Document对象;
2、创建一个IndexWriter对象,并调用它的addDocument方法来添加Document对象;
3、构建一个查询对象;
4、初始化一个IndexSearcher对象,并调用它的search方法查询。
需要说明的是,整个分析过程将以这样一个简单程序的运行步骤展开。网上也有人一个类一个类的分析,不过我觉得那样不易理解,如果结合适当的程序运行过程分析脉络会更清晰一些。
【声明】该文系本人原创,如若转载,请注明转载地址,谢谢合作。