Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。实战 Lucene,第 1 部分: 初识 Lucene
目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的
1.下载使用Lucene工具依赖的jar包lucene-core-3.0.0.jar,以及demo示例 lucene-demos-3.0.0.jar。
2.新建一个普通的Java工程,并且引入1中下载的jar包。
3.新建一个Java类TestLucene.java.
package cn.com.lucen;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
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.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class TestLucene {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
// testLucene();//建立文件索引
testSearch();//根据关键字进行查询资源
}
public static void testSearch() throws Exception{
String indexDir = "E:/lee/index";
String fieldName = "content";
String keyWords = "Exception";
//1 .得到一个search对象
IndexSearcher indexSearcher = new IndexSearcher(
FSDirectory.open(new File(indexDir)),true);
//2.查询语句
QueryParser queryParser = new QueryParser(
Version.LUCENE_CURRENT, fieldName,
new StandardAnalyzer(Version.LUCENE_CURRENT));
//2.1获取query对象
Query query = queryParser.parse(keyWords);
//2.2得到results
TopScoreDocCollector results = TopScoreDocCollector.create(10, false);//取前10条记录
//3.执行查询
indexSearcher.search(query, results);
//4.打印结果
ScoreDoc[] scoreDocs = results.topDocs().scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
Document doc = indexSearcher.doc(scoreDocs[i].doc);
Field fileNameField = doc.getField("fileName");
System.out.println("您要查找的'"+keyWords+"'在:"+fileNameField);
}
}
public static void testLucene() throws Exception{
String indexDir = "E:/lee/index";
String sourceDir = "E:/lee/source";
IndexWriter indexWriter = new IndexWriter(
FSDirectory.open(new File(indexDir)),
new StandardAnalyzer(Version.LUCENE_CURRENT),
true, IndexWriter.MaxFieldLength.LIMITED);
/*
* fileName(包含目录) 文件名
* content文件内容
* field(name,value)
* indexWriter.addDocument(doc);
* */
File file = new File(sourceDir);
File[] files = file.listFiles();
if (files != null) {
Document doc = null;
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getAbsolutePath();
String fileContent = readFile(files[i]);
Field fileNameField = new Field("fileName", fileName, Field.Store.YES, Field.Index.ANALYZED);
Field fileContentField = new Field("content", fileContent, Field.Store.YES, Field.Index.ANALYZED);
doc = new Document();
doc.add(fileNameField);
doc.add(fileContentField);
indexWriter.addDocument(doc);
}
}
indexWriter.optimize();
indexWriter.close();
System.out.println("搜索文件优化完毕。。。");
}
private static String readFile(File file) throws Exception{
StringBuffer strBuffer = new StringBuffer();
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file));
char[] ch = new char[1024];
int count = -1;
while ((count = reader.read(ch)) != -1) {
strBuffer.append(ch,0,count);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
reader.close();
}
return strBuffer.toString();
}
}
小结:通过写demo,对于Lucene工具包的使用有了大致的了解,为后续项目使用奠定了一点点小小的基础。