Lucene3.0和Lucene2.0API有多处改动,以下实例用Luence3.0实现。
第一部分:Lucene建立索引
Lucene建立索引主要有以下两步:
第一步:建立索引器
第二步:添加索引文件
准备在E盘建立testlucene文件夹,然后在testlucene下建立文件夹test和index两个文件夹。
在test文件夹下建立如下四个txt文件
a.txt 内容:中华人民共和国
b.txt 内容:人民共和国
c.txt 内容:人民
d.txt 内容:共和国
这四个文件就是我们要建立索引的文件,
Index文件夹作为索引结果输出文件夹
准备工作完成以后,我们开始建立索引。
第一步:建立索引器,如下
writer = new IndexWriter(FSDirectory.open(new File(Constants.INDEX_STORE_PATH)), new StandardAnalyzer(
Version.LUCENE_30), true, IndexWriter.MaxFieldLength.LIMITED);
第二步:添加索引文件
writer.addDocument(doc);
具体完整代码如下:
-
package
testlucene;
-
-
import
java.util.Date;
-
import
org.apache.lucene.index.IndexWriter;
-
import
org.apache.lucene.analysis.standard.StandardAnalyzer;
-
import
org.apache.lucene.document.Document;
-
import
java.io.File;
-
import
java.io.FileInputStream;
-
import
java.io.BufferedReader;
-
import
java.io.InputStreamReader;
-
import
org.apache.lucene.document.Field;
-
import
org.apache.lucene.util.Version;
-
import
org.apache.lucene.store.FSDirectory;
-
-
public
class
LuceneIndex {
-
-
private
IndexWriter writer =
null
;
-
-
-
public
LuceneIndex() {
-
try
{
-
writer = new
IndexWriter(FSDirectory.open(
new
File(Constants.INDEX_STORE_PATH)),
new
StandardAnalyzer(Version.LUCENE_30),
true
, IndexWriter.MaxFieldLength.LIMITED);
-
} catch
(Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
public
Document getDocument(File f)
throws
Exception {
-
-
Document doc = new
Document();
-
-
FileInputStream input = new
FileInputStream(f);
-
BufferedReader bufferedReader = new
BufferedReader(
new
InputStreamReader(input));
-
-
doc.add(new
Field(
"content"
, bufferedReader));
-
doc.add(new
Field(
"path"
, f.getAbsolutePath(), Field.Store.YES, Field.Index.ANALYZED));
-
return
doc;
-
}
-
-
public
void
writeToIndex()
throws
Exception {
-
File folder = new
File(Constants.INDEX_FILE_PATH);
-
if
(folder.isDirectory()) {
-
String[] files = folder.list();
-
for
(
int
i =
0
; i < files.length; i++) {
-
File file = new
File(folder, files[i]);
-
Document doc = getDocument(file);
-
System.out.println("正在建立索引:"
+ file +
" "
);
-
-
writer.addDocument(doc);
-
}
-
}else
{
-
System.out.println("-----folder.isDirectory():false."
);
-
}
-
}
-
-
public
void
close()
throws
Exception {
-
writer.close();
-
}
-
-
public
static
void
main(String[] args)
throws
Exception {
-
-
LuceneIndex indexer = new
LuceneIndex();
-
-
Date start = new
Date();
-
indexer.writeToIndex();
-
Date end = new
Date();
-
System.out.println("建立索引用时:"
+ (end.getTime() - start.getTime()) +
"毫秒"
);
-
-
indexer.close();
-
}
-
-
}
-
package
testlucene;
-
-
public
class
Constants {
-
-
public
static
final
String INDEX_FILE_PATH =
"E://testlucene//test"
;
-
-
public
static
final
String INDEX_STORE_PATH =
"E://testlucene//index"
;
-
-
}
最后,执行程序,结果如下:
正在建立索引:E:/testlucene/test/a.txt
正在建立索引:E:/testlucene/test/b.txt
正在建立索引:E:/testlucene/test/c.txt
正在建立索引:E:/testlucene/test/d.txt
建立索引用时:47毫秒
在E:/testlucene/index下发现索引结果文件
_7.cfs segments.gen segments_9
第二部分:在索引上检索
在索引上搜索主要包括个步骤,使用两个对象—IndexSearcher和Query。
检索步骤:
第一步:创建索引器
searcher = new IndexSearcher(IndexReader.open(FSDirectory.open(new File(Constants.INDEX_STORE_PATH))));
第二步:将待检索关键字打包成Query对象
query = queryParser.parse(keyword);
第三步:使用索引器检索Query,得到检索结果Hits对象
TopDocs hits = searcher.search(query, 10);
最后,将检索到的结果Hits打印出来:
for (int i = 0; i < hits.scoreDocs.length; i++) {
try {
ScoreDoc scoreDoc = hits.scoreDocs[i];// 有变化的地方
Document doc = searcher.doc(scoreDoc.doc);// 有变化的地方
System.out.print("这是第" + (i+1) + "个检索结果,文件路径为:");
System.out.println(doc.get("path"));
} catch (Exception ex) {
}
全部程序如下:
-
package
testlucene;
-
-
import
org.apache.lucene.search.TopDocs;
-
import
org.apache.lucene.search.IndexSearcher;
-
import
org.apache.lucene.index.IndexReader;
-
import
org.apache.lucene.search.Query;
-
import
org.apache.lucene.queryParser.QueryParser;
-
import
java.util.Date;
-
import
org.apache.lucene.search.ScoreDoc;
-
import
org.apache.lucene.document.Document;
-
import
org.apache.lucene.util.Version;
-
import
org.apache.lucene.analysis.standard.StandardAnalyzer;
-
import
org.apache.lucene.store.FSDirectory;
-
import
java.io.File;
-
-
-
public
class
LuceneSearch {
-
-
private
IndexSearcher searcher =
null
;
-
-
private
Query query =
null
;
-
-
public
LuceneSearch() {
-
try
{
-
-
searcher = new
IndexSearcher(IndexReader.open(FSDirectory.open(
new
File(Constants.INDEX_STORE_PATH))));
-
} catch
(Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
public
final
TopDocs search(String keyword) {
-
System.out.println("正在搜素关键字:"
+ keyword);
-
try
{
-
QueryParser queryParser = new
QueryParser(Version.LUCENE_30,
"content"
,
new
StandardAnalyzer(Version.LUCENE_30));
-
-
query = queryParser.parse(keyword);
-
Date start = new
Date();
-
-
TopDocs hits = searcher.search(query, 10
);
-
Date end = new
Date();
-
System.out.println("搜索完毕用时:"
+ (end.getTime() - start.getTime()) +
"毫秒"
);
-
return
hits;
-
} catch
(Exception ex) {
-
return
null
;
-
}
-
}
-
-
public
void
printResult(TopDocs hits) {
-
if
(hits.totalHits ==
0
) {
-
System.out.println("没有找到您需要的结果"
);
-
} else
{
-
for
(
int
i =
0
; i < hits.scoreDocs.length; i++) {
-
try
{
-
ScoreDoc scoreDoc = hits.scoreDocs[i];
-
Document doc = searcher.doc(scoreDoc.doc);
-
System.out.print("这是第"
+ (i+
1
) +
"个检索结果,文件路径为:"
);
-
System.out.println(doc.get("path"
));
-
-
} catch
(Exception ex) {
-
-
}
-
-
}
-
}
-
System.out.println("--------------------------------"
);
-
}
-
-
public
static
void
main(String[] args)
throws
Exception {
-
LuceneSearch test = new
LuceneSearch();
-
TopDocs hits = null
;
-
-
hits = test.search("中华"
);
-
test.printResult(hits);
-
-
hits = test.search("人民"
);
-
test.printResult(hits);
-
-
hits = test.search("共和国"
);
-
test.printResult(hits);
-
}
-
}
在执行第一部分的程序得到索引后,执行搜索程序LuceneSearch,在控制台下得到结果如下:
(对比我们在f:/testlucene
/test下的四个文件可知,检索结果正确)
正在搜素关键字:中华
搜索完毕用时:15毫秒
这是第1个检索结果,文件路径为:E:/testlucene/test/a.txt
--------------------------------
正在搜素关键字:人民
搜索完毕用时:0毫秒
这是第1个检索结果,文件路径为:E:/testlucene/test/c.txt
这是第2个检索结果,文件路径为:E:/testlucene/test/b.txt
这是第3个检索结果,文件路径为:E:/testlucene/test/a.txt
--------------------------------
正在搜素关键字:共和国
搜索完毕用时:0毫秒
这是第1个检索结果,文件路径为:E:/testlucene/test/d.txt
这是第2个检索结果,文件路径为:E:/testlucene/test/b.txt
这是第3个检索结果,文件路径为:E:/testlucene/test/a.txt
--------------------------------
总结
通过以上两篇文章我们看以看到使用lucene建立索引过程主要有一下4步:
1.提取文本
2.构建Document
3.分析
4.建立索引
分享到:
相关推荐
lucene 3.0 入门实例项目,迅速教会你怎么使用3.0API
lucene3.0 实例,在jdk1.5,lucene3.0下调式通过,可以直接运行。先运行生成索引文件的class,在运行搜索的class。
Lucene 创建索引查询的入门实例,可以直接导入工具
lucene3.0使用介绍及实例,从不同的使用方面介绍了lucene的使用及相应的实例。
实例是一个java实例,可直接导入到MyEclipse中使用。 其中是lucene3.0整合了庖丁解牛分词法,添加了...因为lucene3.0无法整合paoding-analysis.jar 所以我已经把paoding-analysis中的源码整合进来了避免无法整合问题
Lucene3.0和Lucene2.0API有多处改动,该实例用Luence3.0实现
NULL 博文链接:https://cuics-100.iteye.com/blog/1057266
该项目中包括创建索引,增删改查索引,以及关键字高亮显示实例~~对于初学者很有帮助,该项目是基于Lucene3.0
做中文全文检索、搜索必备。 里面有实例代码。 相互学习!
lucene的一个实例程序,lucene3.0文档里面的,平时没怎么注意,今天刚看到
lucene in action 书中的实例代码,包括相应的jar包。 lucene 是3.0版本的 由于上传大小限制,jar包稍后传上
2012-06-13 13:38 9,178,682 Lucene 3.0 原理与代码分析完整版.pdf 2012-06-13 13:46 10,582,426 姚晨屏保(宽屏).exe 2012-06-13 13:10 23,625,694 Visual.C.系统开发实例精粹(源代码).7z 2012-06-13 13:46 25,062,...
一个Java开源的WebBlog,使用关系数据库存储数据 和 DLOG4J 3.0是一个多用户博客系统 以个人应用为出发点增加包括相册、音乐、论坛、留言板等功能 增加了好友、黑名单功能 允许设置空间的样式...
BPMX3提供了基于BPMN2标准的流程管理,包括流程版本变量,流程节点表单设置,表单的权限设置,流程任务通知,催办,代办,转化,并行会签、串行会签、补签,子流程,同步任务,多实例任务,人工任务、消息任务、邮件...
第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...
第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...
第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...
第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...