package Lucene_01;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.codecs.blocktree.FieldReader;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
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;
@SuppressWarnings("all")
public class HelloLucene {
// 建立索引
public void index() {
// 1.创建Directory
// Directory directory=new RAMDirectory(); //建立在内存中
IndexWriter iwriter = null;
try {
Directory directory = FSDirectory.open(new File(
"D:/Lucene/lucene01")); // 创建在硬盘上
// 2.创建IndexWriter
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_9,
new StandardAnalyzer(Version.LUCENE_4_9));
iwriter = new IndexWriter(directory, iwc);
// iwriter.commit();
// 3.创建Document对象
Document doc = null;
// 4.为Document添加Field
File f = new File("D:/Lucene/example");
for (File file : f.listFiles()) {
doc = new Document();
doc.add(new Field("content", new FileReader(file)));
doc.add(new Field("filename", file.getName(), Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new Field("path", file.getAbsolutePath(),
Field.Store.YES, Field.Index.NOT_ANALYZED));
// 通过IndexWriter 添加文档到索引中
iwriter.addDocument(doc);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (iwriter != null) {
try {
iwriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 关闭流
}
}
}
public void searcher() {
// 1.创建directory
try {
Directory directory = FSDirectory.open(new File(
"D:/Lucene/lucene01"));// 创建在硬盘上
// //2.创建IndexReader
// IndexReader reader=IndexReader.open(directory);
// //3.genju IndexReader创建IndexSearcher
// IndexSearcher searcher=new IndexSearcher(reader);
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// 4.创建索引Query
// 创建parser来确定要搜索文件的内容,第二个参数表示搜索的域
QueryParser parser = new QueryParser(Version.LUCENE_4_9, "content",
new StandardAnalyzer(Version.LUCENE_4_9));
// 创建query,表示搜索域为content中包含的java文档
Query query = parser.parse("java");
// 5.根据seacher搜索并且返回Topdocs
TopDocs tds = searcher.search(query, 10);
// 6.根据Topdocs获取ScoreDoc对象
ScoreDoc[] sds = tds.scoreDocs;
for (ScoreDoc sd : sds) {
// 7.根据docment对象获取具体Document对象
Document d = searcher.doc(sd.doc);
// 8.根据Document对象获取需要的值
System.out.println(d.get("filename") + "[" + d.get("path")
+ "]");
}
// 9.关闭reader
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这个程序中最重要的是理解索引创建的步骤。
doc = new Document();
这个地方是特别容易错的,必须将它放在for循环体里面,不然会报错的,IndexWriter里面是包含多个Document对象的。