Lucene4.5索引的创建与搜索

来源:互联网 发布:网络鲜花速递排名 编辑:程序博客网 时间:2024/04/29 14:24

最近再看Lucene,在网上也看了不少的例子,现在把我做的拿出来。

1、首先去http://mirrors.cnnic.cn/apache/lucene/java/4.5.0/下载lucene4.5的jar包。解压出来

2、在MyEclipse里面新建一个JAVA项目,将以下jar包拷入项目,其中junit-4.11.jar是测试单元的jar包


3、在I盘创建文件夹lucene,在里面创建连个文件夹,一个index(放要创建的文件),一个indexed(放保存索引),在index文件夹里面放待创建索引的文件

4、新建一个创建索引的Index类,如下

[java] view plaincopyprint?
  1. package www.lucene.com;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8.   
  9. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  10. import org.apache.lucene.document.Document;  
  11. import org.apache.lucene.document.Field;  
  12. import org.apache.lucene.document.StringField;  
  13. import org.apache.lucene.document.TextField;  
  14. import org.apache.lucene.index.IndexWriter;  
  15. import org.apache.lucene.index.IndexWriterConfig;  
  16. import org.apache.lucene.store.Directory;  
  17. import org.apache.lucene.store.FSDirectory;  
  18. import org.apache.lucene.util.Version;  
  19.   
  20. public class Index {  
  21.       
  22.     /** 
  23.      * @ 创建索引 
  24.      */  
  25.     public void createIndex(){  
  26.         IndexWriter writer = null ;  
  27.         try {  
  28.             //1、创建Directory对象  
  29.             Directory dir = FSDirectory.open(new File("I:/lucene/indexed"));  
  30.             //2、创建indexWrite  
  31.             writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_45, new StandardAnalyzer(Version.LUCENE_45))) ;  
  32.             //3、创建document对象  
  33.             Document document = null ;  
  34.             //4、将要索引的文件已Field形式添加到document  
  35.             File files = new File("I:/lucene/index") ;  
  36.             for(File file:files.listFiles()){  
  37.                 document = new Document();  
  38.                 document.add(new StringField("fileName",file.getName(),Field.Store.YES)) ;     //为文件名创建索引,存储  
  39.                 document.add(new StringField("filePath",file.getAbsolutePath(),Field.Store.YES)) ;     //为文件路径创建索引,存储  
  40.                 document.add(new TextField("content",new BufferedReader(  
  41.                                                         new InputStreamReader(  
  42.                                                             new FileInputStream(file), "UTF-8")))) ;   //为内容创建索引,但不存储  
  43.                 writer.addDocument(document) ;  
  44.                   
  45.             }  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }finally{  
  49.             if(writer != null){  
  50.                 try {  
  51.                     writer.close() ;  
  52.                 } catch (IOException e) {  
  53.                     e.printStackTrace();  
  54.                 }  
  55.             }  
  56.               
  57.         }  
  58.     }  
  59.   
  60.   
  61. }  

5、创建查询索引的类,如下:

[java] view plaincopyprint?
  1. package www.lucene.com;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.index.DirectoryReader;  
  9. import org.apache.lucene.index.IndexReader;  
  10. import org.apache.lucene.queryparser.classic.ParseException;  
  11. import org.apache.lucene.queryparser.classic.QueryParser;  
  12. import org.apache.lucene.search.IndexSearcher;  
  13. import org.apache.lucene.search.Query;  
  14. import org.apache.lucene.search.ScoreDoc;  
  15. import org.apache.lucene.search.TopDocs;  
  16. import org.apache.lucene.store.Directory;  
  17. import org.apache.lucene.store.FSDirectory;  
  18. import org.apache.lucene.util.Version;  
  19.   
  20. public class Searcher {  
  21.       
  22.     /** 
  23.      * @ 搜索 
  24.      */  
  25.     public void searchIndex(){  
  26.         try {  
  27.             //1.创建Directory  
  28.             Directory dir = FSDirectory.open(new File("i:/lucene/indexed"));  
  29.             //2.创建IndexReader  
  30.             IndexReader reader = DirectoryReader.open(dir) ;  
  31.             //3.根据IndexReader创建IndexSearcher  
  32.             IndexSearcher searcher = new IndexSearcher(reader) ;  
  33.             //4.创建搜索的Query  
  34.             //创建parser来确定搜索的内容,第二个参数表示搜索的域  
  35.             QueryParser parser = new QueryParser(Version.LUCENE_45,"content"new StandardAnalyzer(Version.LUCENE_45)) ;  
  36.             //创建query,表示搜索域中包含'Directory'的文档  
  37.             Query query = parser.parse("Directory") ;  
  38.             //5.根据search搜索返回TopDocs,要设置返回条数  
  39.             TopDocs docs = searcher.search(query, 10) ;  
  40.             //6.根据TopDocs获取ScoreDoc  
  41.             for(ScoreDoc doc: docs.scoreDocs){  
  42.                 //7.根据searcher和scoredoc获取具体的Document对象  
  43.                 Document document = searcher.doc(doc.doc) ;  
  44.                 //8.根据Document对象获取需要的内容  
  45.                 System.out.println(document.get("fileName")+"["+document.get("filePath")+"]");  
  46.             }  
  47.             //9.关闭reader  
  48.             reader.close();  
  49.         } catch (IOException e) {  
  50.             e.printStackTrace();  
  51.         }catch (ParseException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.           
  55.     }  
  56.   
  57. }  

6、新建一个测试类,来测试这两个,不过先要执行创建索引的,然后查询,如下:

[java] view plaincopyprint?
  1. package www.lucene.com;  
  2.   
  3. public class TestLucene {  
  4.     public static void main(String[] args) {  
  5.         Index index = new Index() ;  
  6.         index.createIndex() ;  
  7.         Searcher searcher = new Searcher() ;  
  8.         searcher.searchIndex() ;  
  9.     }  
  10. }  

7、执行结果:

(本文转自http://blog.csdn.net/yu_han_23/article/details/12348285)

0 0
原创粉丝点击