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.建立索引