Lucene 是一个基于Java的全文信息检索工具包,是Apache软件基金会jakarta项目组的一个子项目,为应用程序提供索引和搜索功能,其它介绍网上多的是……
在全文索引工具中都是由这样的三部分组成:
1.索引部分
2.分词部分(如何分词)
3.搜索部分
觉得学习一个新知识还是直接从一个简单的例子学习来的快,就如刚开始学习c时,先从”hello world!”,然后慢慢分析其中的细节,那下面来就来看一个简单的例子吧,这个例子实现功能:在一些文档中查找某个关键词
所需要的jar包,都在lucene下载包里,只不过在不同的文件夹下:
lucene-core-4.2.1.jar
lucene-queryparser-4.2.1.jar
lucene-analyzers-common-4.2.1.jar
下面的代码有详细的解释:
public class HelloLucene {
/*
* 建立索引
*/
public void index() {
IndexWriter writer = null;
try {
// 1.创建Directory,确定索引建立在硬盘或者是内存中
// Directory directory=new RAMDirectory(); //建立在内存中
Directory directory = FSDirectory
.open(new File("f:\\lucene\\index"));// 把索引存在这个位置
// 2.创建IndexWriter,通过它来写索引到上述位置 参1:lucene的版本,参2:用的分词器
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42,
new StandardAnalyzer(Version.LUCENE_42));
writer = new IndexWriter(directory, iwc);
// 3.创建Document对象,相当于数据库中的表 处理要建立索引的文档
Document doc = null;
// 4.为Document添加Field,Field相当于数据库中的字段
File file = new File("F:\\lucene\\documents");// 要建立索引的文档所在文件夹
// 为每篇文档添加field,索引文档的 内容/名称/路径
for (File f : file.listFiles()) {
doc = new Document();
doc.add(new TextField("content", new FileReader(f)));// 分词,不存储
doc.add(new StringField("filename", f.getName(),
Field.Store.YES));// 不分词,存储
doc.add(new StringField("path", f.getAbsolutePath(),
Field.Store.YES));// 在api中看看TextField和StringField的不同
// 5.通过IndexWriter添加文档到索引中
writer.addDocument(doc);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null)
try {
writer.close();
} catch (IOException e) {
}
}
}
/*** 搜索 */
public void seracher() {
// 1.创建Directory
Directory directory;
try {
directory = FSDirectory.open(new File("f:\\lucene\\index"));
// 2.创建IndexReader 读取索引
IndexReader reader = DirectoryReader.open(directory);
// 3.根据IndexReader创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(reader);
// 4.创建搜索的Query
// 创建parser来确定要搜索文件的内容,第二个参数表示搜索的域
QueryParser parser = new QueryParser(Version.LUCENE_42, "content",
new StandardAnalyzer(Version.LUCENE_42));
// 创建query,表示搜索域为content中包含java的文档
Query query = parser.parse("target");
// 5.根据Searcher 搜索并且返回TopDocs,第二个参数表示要显示的条数
TopDocs tds = searcher.search(query, 10);
// 6.根据TopDocs获取ScoreDoc对象
ScoreDoc[] sds = tds.scoreDocs; // score就是相关度最高的评分
for (ScoreDoc sd : sds) {
// 7.根据Searcher和ScoreDoc对象获取具体的Document对象
Document d = searcher.doc(sd.doc);// 根据id获取文档
// 8.根据Document对象获取需要的值 content没有保存会输出null
System.out.println(d.get("filename") + "[" + d.get("path")
+ "]" + d.get("content"));
}
// 9.关闭reader
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
下图是运行index()后产生的文件: