`

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

分享到:
评论
1 楼 chasewade 2012-02-17  
很好  很适合入门

相关推荐

    lucene 3.0 入门实例

    lucene 3.0 入门实例项目,迅速教会你怎么使用3.0API

    lucene3.0 实例

    lucene3.0 实例,在jdk1.5,lucene3.0下调式通过,可以直接运行。先运行生成索引文件的class,在运行搜索的class。

    Lucene3.0入门实例含jar包

    Lucene 创建索引查询的入门实例,可以直接导入工具

    lucene3.0使用介绍及实例

    lucene3.0使用介绍及实例,从不同的使用方面介绍了lucene的使用及相应的实例。

    lucene3.0 整合庖丁解牛实例

    实例是一个java实例,可直接导入到MyEclipse中使用。 其中是lucene3.0整合了庖丁解牛分词法,添加了...因为lucene3.0无法整合paoding-analysis.jar 所以我已经把paoding-analysis中的源码整合进来了避免无法整合问题

    lucene3.0全文检索入门实例

    Lucene3.0和Lucene2.0API有多处改动,该实例用Luence3.0实现

    Apache Lucene3.0 入门实例介绍

    NULL 博文链接:https://cuics-100.iteye.com/blog/1057266

    Lucene3.0增删改查和关键字高亮实例

    该项目中包括创建索引,增删改查索引,以及关键字高亮显示实例~~对于初学者很有帮助,该项目是基于Lucene3.0

    盘古分词+Lucene

    做中文全文检索、搜索必备。 里面有实例代码。 相互学习!

    luceneweb.war

    lucene的一个实例程序,lucene3.0文档里面的,平时没怎么注意,今天刚看到

    lucene in action 书中例子源码

    lucene in action 书中的实例代码,包括相应的jar包。 lucene 是3.0版本的 由于上传大小限制,jar包稍后传上

    若干vc代码1352.rar

    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,...

    2个开源的BLOG

    一个Java开源的WebBlog,使用关系数据库存储数据 和 DLOG4J 3.0是一个多用户博客系统 以个人应用为出发点增加包括相册、音乐、论坛、留言板等功能 增加了好友、黑名单功能 允许设置空间的样式...

    基于jbpm与activiti的工作流平台技术架构介绍

    BPMX3提供了基于BPMN2标准的流程管理,包括流程版本变量,流程节点表单设置,表单的权限设置,流程任务通知,催办,代办,转化,并行会签、串行会签、补签,子流程,同步任务,多实例任务,人工任务、消息任务、邮件...

    JAVA WEB典型模块与项目实战大全.part2(第二卷)

    第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...

    JAVA WEB典型模块与项目实战大全.part4

    第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...

    JAVA WEB典型模块与项目实战大全.part3(第三卷)

    第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...

    JAVA WEB典型模块与项目实战大全.part1(第一卷)

    第9章 搜索索引(Lucene+Web Spider) 第10章 在线网上支付(JSP+Swrvlet+JavaBean) 第11章 JavaWeb邮件发送系统(JSP+Servlet+JavaBean) 第12章 网络留言板(JSP+Servlet+JavaBean) 第13章 网络留言板续——...

Global site tag (gtag.js) - Google Analytics