lucene3.0基础实例

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);


具体完整代码如下:
 

  1. package  testlucene;  
  2.   
  3. import  java.util.Date;  
  4. import  org.apache.lucene.index.IndexWriter;  
  5. import  org.apache.lucene.analysis.standard.StandardAnalyzer;  
  6. import  org.apache.lucene.document.Document;  
  7. import  java.io.File;  
  8. import  java.io.FileInputStream;  
  9. import  java.io.BufferedReader;  
  10. import  java.io.InputStreamReader;  
  11. import  org.apache.lucene.document.Field;  
  12. import  org.apache.lucene.util.Version;  
  13. import  org.apache.lucene.store.FSDirectory;  
  14.   
  15. public   class  LuceneIndex {  
  16.     // 索引器对象   
  17.     private  IndexWriter writer =  null ;  
  18.       
  19.     // 在构造函数中建立索引器   
  20.     public  LuceneIndex() {  
  21.         try  {  
  22.             writer = new  IndexWriter(FSDirectory.open( new  File(Constants.INDEX_STORE_PATH)),  new  StandardAnalyzer(Version.LUCENE_30),  true , IndexWriter.MaxFieldLength.LIMITED); // 有变化的地方   
  23.         } catch  (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28.     public  Document getDocument(File f)  throws  Exception {  
  29.         // 生成文档对象   
  30.         Document doc = new  Document();  
  31.         // 获取文件输入流   
  32.         FileInputStream input = new  FileInputStream(f);  
  33.         BufferedReader bufferedReader = new  BufferedReader( new  InputStreamReader(input));  
  34.         // 添加索引内容   
  35.         doc.add(new  Field( "content" , bufferedReader)); // Lucene3.0有变化的地方   
  36.         doc.add(new  Field( "path" , f.getAbsolutePath(), Field.Store.YES, Field.Index.ANALYZED)); // Lucene3.0有变化的地方   
  37.         return  doc;  
  38.     }  
  39.       
  40.     public   void  writeToIndex()  throws  Exception {  
  41.         File folder = new  File(Constants.INDEX_FILE_PATH);  
  42.         if  (folder.isDirectory()) {  
  43.             String[] files = folder.list();  
  44.             for  ( int  i =  0 ; i < files.length; i++) {  
  45.                 File file = new  File(folder, files[i]);  
  46.                 Document doc = getDocument(file);  
  47.                 System.out.println("正在建立索引:"  + file +  " " );  
  48.                 // 添加索引文件   
  49.                 writer.addDocument(doc);  
  50.             }  
  51.         }else  {  
  52.             System.out.println("-----folder.isDirectory():false." );  
  53.         }  
  54.     }  
  55.   
  56.     public   void  close()  throws  Exception {  
  57.         writer.close();  
  58.     }  
  59.   
  60.     public   static   void  main(String[] args)  throws  Exception {  
  61.         // 声明一个对象   
  62.         LuceneIndex indexer = new  LuceneIndex();  
  63.         // 建立索引   
  64.         Date start = new  Date();  
  65.         indexer.writeToIndex();  
  66.         Date end = new  Date();  
  67.         System.out.println("建立索引用时:"  + (end.getTime() - start.getTime()) +  "毫秒" );  
  68.         // 关闭索引器   
  69.         indexer.close();  
  70.     }  
  71.       
  72. }  

 

  1. package  testlucene;  
  2.   
  3. public   class  Constants {  
  4.    //要建立索引的文件的存放路径   
  5.    public   static   final  String INDEX_FILE_PATH =  "E://testlucene//test" ;  
  6.    //索引存放的位置   
  7.    public   static   final  String INDEX_STORE_PATH =  "E://testlucene//index" ;  
  8.   
  9. }  

最后,执行程序,结果如下:
正在建立索引: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) {

    }
全部程序如下:

  1. package  testlucene;  
  2.   
  3. import  org.apache.lucene.search.TopDocs;  
  4. import  org.apache.lucene.search.IndexSearcher;  
  5. import  org.apache.lucene.index.IndexReader;  
  6. import  org.apache.lucene.search.Query;  
  7. import  org.apache.lucene.queryParser.QueryParser;  
  8. import  java.util.Date;  
  9. import  org.apache.lucene.search.ScoreDoc;  
  10. import  org.apache.lucene.document.Document;  
  11. import  org.apache.lucene.util.Version;  
  12. import  org.apache.lucene.analysis.standard.StandardAnalyzer;  
  13. import  org.apache.lucene.store.FSDirectory;  
  14. import  java.io.File;  
  15.   
  16.   
  17. public   class  LuceneSearch {  
  18.     // 声明一个IndexSearcher对象   
  19.     private  IndexSearcher searcher =  null ;  
  20.     // 声明一个Query对象   
  21.     private  Query query =  null ;  
  22.   
  23.     public  LuceneSearch() {  
  24.         try  {  
  25.             // 创建索引器   
  26.             searcher = new  IndexSearcher(IndexReader.open(FSDirectory.open( new  File(Constants.INDEX_STORE_PATH))));  
  27.         } catch  (Exception e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.     }  
  31.   
  32.     public   final  TopDocs search(String keyword) {  
  33.         System.out.println("正在搜素关键字:"  + keyword);  
  34.         try  {  
  35.             QueryParser queryParser = new  QueryParser(Version.LUCENE_30,  "content" new  StandardAnalyzer(Version.LUCENE_30));  
  36.             // 将待检索关键字打包成Query对象   
  37.             query = queryParser.parse(keyword);  
  38.             Date start = new  Date();  
  39.             // 使用索引器检索Query,得到检索结果Hits对象   
  40.             TopDocs hits = searcher.search(query, 10 ); // 有变化的地方   
  41.             Date end = new  Date();  
  42.             System.out.println("搜索完毕用时:"  + (end.getTime() - start.getTime())    +  "毫秒" );  
  43.             return  hits;  
  44.         } catch  (Exception ex) {  
  45.             return   null ;  
  46.         }  
  47.     }  
  48.   
  49.     public   void  printResult(TopDocs hits) {  
  50.         if  (hits.totalHits ==  0 ) {  
  51.             System.out.println("没有找到您需要的结果" );  
  52.         } else  {  
  53.             for  ( int  i =  0 ; i < hits.scoreDocs.length; i++) {  
  54.                 try  {  
  55.                     ScoreDoc scoreDoc = hits.scoreDocs[i];// 有变化的地方   
  56.                     Document doc = searcher.doc(scoreDoc.doc);// 有变化的地方   
  57.                     System.out.print("这是第"  + (i+ 1 ) +  "个检索结果,文件路径为:" );  
  58.                     System.out.println(doc.get("path" ));  
  59.   
  60.                 } catch  (Exception ex) {  
  61.   
  62.                 }  
  63.   
  64.             }  
  65.         }  
  66.         System.out.println("--------------------------------" );  
  67.     }  
  68.   
  69.     public   static   void  main(String[] args)  throws  Exception {         
  70.         LuceneSearch test = new  LuceneSearch();  
  71.         TopDocs hits = null ;  
  72.   
  73.         hits = test.search("中华" );  
  74.         test.printResult(hits);  
  75.   
  76.         hits = test.search("人民" );  
  77.         test.printResult(hits);  
  78.   
  79.         hits = test.search("共和国" );  
  80.         test.printResult(hits);  
  81.     }  
  82. }  

在执行第一部分的程序得到索引后,执行搜索程序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)