最近再看Lucene,在网上也看了不少的例子,现在把我做的拿出来。
1、首先去http://mirrors.cnnic.cn/apache/lucene/java/4.5.0/下载lucene4.5的jar包。解压出来
2、在MyEclipse里面新建一个JAVA项目,将以下jar包拷入项目,其中junit-4.11.jar是测试单元的jar包
3、在I盘创建文件夹lucene,在里面创建连个文件夹,一个index(放要创建的文件),一个indexed(放保存索引),在index文件夹里面放待创建索引的文件
4、新建一个创建索引的Index类,如下
package www.lucene.com;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Index {
/**
* @ 创建索引
*/
public void createIndex(){
IndexWriter writer = null ;
try {
//1、创建Directory对象
Directory dir = FSDirectory.open(new File("I:/lucene/indexed"));
//2、创建indexWrite
writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_45, new StandardAnalyzer(Version.LUCENE_45))) ;
//3、创建document对象
Document document = null ;
//4、将要索引的文件已Field形式添加到document
File files = new File("I:/lucene/index") ;
for(File file:files.listFiles()){
document = new Document();
document.add(new StringField("fileName",file.getName(),Field.Store.YES)) ; //为文件名创建索引,存储
document.add(new StringField("filePath",file.getAbsolutePath(),Field.Store.YES)) ; //为文件路径创建索引,存储
document.add(new TextField("content",new BufferedReader(
new InputStreamReader(
new FileInputStream(file), "UTF-8")))) ; //为内容创建索引,但不存储
writer.addDocument(document) ;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(writer != null){
try {
writer.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5、创建查询索引的类,如下:
package www.lucene.com;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
/**
* @ 搜索
*/
public void searchIndex(){
try {
//1.创建Directory
Directory dir = FSDirectory.open(new File("i:/lucene/indexed"));
//2.创建IndexReader
IndexReader reader = DirectoryReader.open(dir) ;
//3.根据IndexReader创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(reader) ;
//4.创建搜索的Query
//创建parser来确定搜索的内容,第二个参数表示搜索的域
QueryParser parser = new QueryParser(Version.LUCENE_45,"content", new StandardAnalyzer(Version.LUCENE_45)) ;
//创建query,表示搜索域中包含'Directory'的文档
Query query = parser.parse("Directory") ;
//5.根据search搜索返回TopDocs,要设置返回条数
TopDocs docs = searcher.search(query, 10) ;
//6.根据TopDocs获取ScoreDoc
for(ScoreDoc doc: docs.scoreDocs){
//7.根据searcher和scoredoc获取具体的Document对象
Document document = searcher.doc(doc.doc) ;
//8.根据Document对象获取需要的内容
System.out.println(document.get("fileName")+"["+document.get("filePath")+"]");
}
//9.关闭reader
reader.close();
} catch (IOException e) {
e.printStackTrace();
}catch (ParseException e) {
e.printStackTrace();
}
}
}
6、新建一个测试类,来测试这两个,不过先要执行创建索引的,然后查询,如下:
package www.lucene.com;
public class TestLucene {
public static void main(String[] args) {
Index index = new Index() ;
index.createIndex() ;
Searcher searcher = new Searcher() ;
searcher.searchIndex() ;
}
}
7、执行结果: