读书人

Lucene建立索引搜索入门范例

发布时间: 2012-11-19 10:18:51 作者: rapoo

Lucene建立索引搜索入门实例

?? 第一部分:Lucene建立索引
Lucene建立索引主要有以下两步:
第一步:建立索引器
第二步:添加索引文件
准备在f盘建立lucene文件夹,然后在lucene下建立文件夹test和index两个文件夹。
在test文件夹下建立如下四个txt文件
a.txt 内容:中华人民共和国
b.txt 内容:人民共和国
c.txt 内容:人民
d.txt 内容:共和国

这四个文件就是我们要建立索引的文件,
Index文件夹作为索引结果输出文件夹

准备工作完成以后,我们开始建立索引。
第一步:建立索引器,如下
IndexWriter writer = new IndexWriter("f:\\lucene\\index",
????? new StandardAnalyzer(), true);
第二步:添加索引文件
writer.addDocument(..);
具体完整代码如下:
package com.peng.mylucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
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;
public class LuceneIndex {
public static void main(String[] args) {
?? try {
??? LuceneIndex index = new LuceneIndex();
??? Date start = new Date();
??? index.writeToIndex();
??? Date end = new Date();
??? System.out.println("建立索引用时" + (end.getTime() - start.getTime())+" 毫秒");
??? index.close();
?? } catch (Exception e) {
??? e.printStackTrace();
?? }
}
//索引器
private IndexWriter writer = null;
public LuceneIndex() {
?? try {
??? //建立索引器,指定索引存放目录,分析器--new StandardAnalyzer()
??? writer = new IndexWriter("f:\\lucene\\index",
????? new StandardAnalyzer(), true);
?? } catch (Exception e) {
??? e.printStackTrace();
?? }
}
private Document getDocument(File f) {
?? //将要建立索引的文件构造成Document对象,并添加域content
?? Document doc = new Document();
?? BufferedReader bufReader = null;
?? try {
??? bufReader = new BufferedReader(new InputStreamReader(
????? new FileInputStream(f)));
?? } catch (FileNotFoundException e) {
??? e.printStackTrace();
?? }
?? //添加内容
?? doc.add(Field.Text("contents", bufReader));
?? doc.add(Field.Keyword("path", f.getAbsolutePath()));
?? return doc;
}
private void writeToIndex() {
?? //将目录f:\\lucene\\test下的文件,先通过getDocument(File)函数,
?? //构造成Document, 然后添加到索引器writer
?? File folder = new File("f:\\lucene\\test");
?? if (folder.isDirectory()) {
??? File[] list = folder.listFiles();
??? for (File f : list) {
???? Document doc = getDocument(f);
???? try {
????? System.out.println("建立索引:" + f);
????? writer.addDocument(doc);
???? } catch (IOException e) {
????? e.printStackTrace();
???? }
??? }
?? }
}
private void close() {
?? try {//关闭索引器
??? writer.close();
?? } catch (IOException e) {
??? e.printStackTrace();
?? }
}
}
最后,执行程序,结果如下:
建立索引:f:\lucene\test\a.txt
建立索引:f:\lucene\test\b.txt
建立索引:f:\lucene\test\c.txt
建立索引:f:\lucene\test\d.txt
建立索引用时63 毫秒
在f:\lucene\index下发现索引结果文件
_4.cfs deletable segments

???????????????????????????????????? 第二部分:在索引上搜索入门实例
在索引上搜索主要包括个步骤,使用两个对象—IndexSearcher和Query。
检索步骤:
第一步:创建索引器
searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
第二步:将待检索关键字打包成Query对象
query = QueryParser.parse(key, "contents", new StandardAnalyzer());
第三步:使用索引器检索Query,得到检索结果Hits对象
Hits hit = searcher.search(query);
最后,将检索到的结果Hits打印出来:
for (int i = 0; i < h.length(); ++i) {
?? Document doc = h.doc(i);
?? System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
??????? + doc.get("path"));
}
全部程序如下:
package com.peng.mylucene;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
public class LuceneSearch {
public static void main(String[] args) {
?? LuceneSearch test = new LuceneSearch();
?? Hits hit = null;// new Hits();
?? hit = test.search("中华");
?? test.dispalyResult(hit);
?? hit = test.search("人民");
?? test.dispalyResult(hit);
?? hit = test.search("共和国");
?? test.dispalyResult(hit);
}
public LuceneSearch() {
?? try {// IndexReader.open()指名索引所在文件夹
??? searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
?? } catch (IOException e) {
??? e.printStackTrace();
?? }
}
// 声明IndexSearcher对象
private IndexSearcher searcher = null;
// 声明Query对象
private Query query = null;
public Hits search(String key) {
?? System.out.println("正在检索关键字:" + key);
?? try {// 将关键字包装为Query对象
??? query = QueryParser.parse(key, "contents", new StandardAnalyzer());
??? Date start = new Date();
??? Hits hit = searcher.search(query);
??? Date end = new Date();
??? System.out.println("检索完成,用时:" + (end.getTime() - start.getTime())
????? + " 毫秒");
??? return hit;
?? } catch (Exception e) {
??? e.printStackTrace();
?? }
?? return null;
}
public void dispalyResult(Hits h) {
?? if (h.length() < 1) {
??? System.out.println("no result !");
??? return;
?? } else {
??? for (int i = 0; i < h.length(); ++i) {
???? try {
????? Document doc = h.doc(i);
????? System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
??????? + doc.get("path"));
???? } catch (IOException e) {
????? e.printStackTrace();
???? }
??? }
??? System.out.println("----------------------");
?? }
}
}

在执行第一部分的程序得到索引后,执行搜索程序LuceneSearch,在控制台下得到结果如下:
(对比我们在f:\lucene\test下的四个文件可知,检索结果正确)
正在检索关键字:中华
检索完成,用时:47 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:人民
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\c.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:共和国
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\d.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------

总结
通过以上两篇文章我们看以看到使用lucene建立索引过程主要有一下4步:
1.提取文本
2.构—ocument
3.分析
4.建立索引

参考《征服ajax+lucene构建搜索引擎》

读书人网 >编程

热点推荐