Lucene介绍和创建索引和搜索初步

来源:互联网 发布:p2p摄像头监控软件 编辑:程序博客网 时间:2024/05/12 17:56

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

以上介绍来自百度百科。

在全文索引工具中,都是由三部分组成的:

1,索引部分

2,分词部分

3,搜索部分

下面进入Lucene的学习,由lucene创建索引

创建工程引入jar包lucene-core-3.6.2.jar

HelloLucene.java

 

  1. import java.io.File; 
  2. import java.io.FileReader; 
  3. import java.io.IOException; 
  4. import java.io.Reader; 
  5.  
  6. import org.apache.lucene.analysis.Analyzer; 
  7. import org.apache.lucene.analysis.TokenStream; 
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer; 
  9. import org.apache.lucene.document.Document; 
  10. import org.apache.lucene.document.Field; 
  11. import org.apache.lucene.index.CorruptIndexException; 
  12. import org.apache.lucene.index.IndexReader; 
  13. import org.apache.lucene.index.IndexWriter; 
  14. import org.apache.lucene.index.IndexWriterConfig; 
  15. import org.apache.lucene.queryParser.ParseException; 
  16. import org.apache.lucene.queryParser.QueryParser; 
  17. import org.apache.lucene.search.IndexSearcher; 
  18. import org.apache.lucene.search.Query; 
  19. import org.apache.lucene.search.ScoreDoc; 
  20. import org.apache.lucene.search.TopDocs; 
  21. import org.apache.lucene.store.Directory; 
  22. import org.apache.lucene.store.FSDirectory; 
  23. import org.apache.lucene.store.LockObtainFailedException; 
  24. import org.apache.lucene.store.RAMDirectory; 
  25. import org.apache.lucene.util.Version; 
  26.  
  27.  
  28. public class HelloLucene { 
  29.     /** 
  30.      * 建立索引 
  31.      */ 
  32.     public void index(){ 
  33.         IndexWriter writer = null
  34.          
  35.         try { 
  36.             //1,创建词典 
  37. //          Directory directory = new RAMDirectory();//存储到内存 
  38.             Directory directory = FSDirectory.open(new File("D:\\lucene\\index")); 
  39.             //2,创建IndexWriter索引笔 
  40.             IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)); 
  41.             writer = new IndexWriter(directory, config); 
  42.  
  43.             //3,创建Document对象 
  44.             Document doc = null
  45.             File file = new File("d:/lucene/file"); 
  46.             for(File f : file.listFiles()){ 
  47.                 doc = new Document(); 
  48.                 //4,为Document添加Field 
  49.                 doc.add(new Field("content",new FileReader(f))); 
  50.                 doc.add(new Field("filename",f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED)); 
  51.                 doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED)); 
  52.                 //5,通过IndexWriter添加文档到索引中 
  53.                 writer.addDocument(doc); 
  54.             } 
  55.         } catch (CorruptIndexException e) { 
  56.             // TODO Auto-generated catch block 
  57.             e.printStackTrace(); 
  58.         } catch (LockObtainFailedException e) { 
  59.             // TODO Auto-generated catch block 
  60.             e.printStackTrace(); 
  61.         } catch (IOException e) { 
  62.             // TODO Auto-generated catch block 
  63.             e.printStackTrace(); 
  64.         }finally
  65.             if(writer!=null){ 
  66.                 try { 
  67.                     writer.close(); 
  68.                 } catch (CorruptIndexException e) { 
  69.                     // TODO Auto-generated catch block 
  70.                     e.printStackTrace(); 
  71.                 } catch (IOException e) { 
  72.                     // TODO Auto-generated catch block 
  73.                     e.printStackTrace(); 
  74.                 } 
  75.             } 
  76.         } 
  77.     } 
  78.     /** 
  79.      * 搜索 
  80.      */ 
  81.     public void search(){ 
  82.         IndexReader reader = null
  83.         try { 
  84.             //1,创建Directory 
  85.             Directory directory = FSDirectory.open(new File("d:/lucene/index")); 
  86.             //2,创建IndexReader 
  87.             reader = IndexReader.open(directory); 
  88.             //3,根据IndexReader创建IndexSearcher 
  89.             IndexSearcher searcher = new IndexSearcher(reader); 
  90.             //4,创建搜索的Query 
  91.             QueryParser parser = new QueryParser(Version.LUCENE_35, "content"new StandardAnalyzer(Version.LUCENE_35)); 
  92.             Query query = parser.parse("Apache License"); 
  93.             //5,根据searcher搜索并返回TopDocs 
  94.             TopDocs tds = searcher.search(query, 10); 
  95.             //6,根据TopDocs获取ScoreDoc对象 
  96.             ScoreDoc[] sds = tds.scoreDocs; 
  97.             //7,根据searcher和ScoreDoc对象获取具体的Document对象 
  98.             for(ScoreDoc sd:sds){ 
  99.                 Document doc = searcher.doc(sd.doc); 
  100.                 //8,根据Document对象获取需要的值 
  101.                 System.out.println(doc.get("filename")+":"+doc.get("path")); 
  102.             } 
  103.         } catch (IOException e) { 
  104.             // TODO Auto-generated catch block 
  105.             e.printStackTrace(); 
  106.         } catch (ParseException e) { 
  107.             // TODO Auto-generated catch block 
  108.             e.printStackTrace(); 
  109.         }finally
  110.             //9,关闭reader 
  111.             if(reader!=null){ 
  112.                 try { 
  113.                     reader.close(); 
  114.                 } catch (IOException e) { 
  115.                     // TODO Auto-generated catch block 
  116.                     e.printStackTrace(); 
  117.                 } 
  118.             } 
  119.         } 
  120.          
  121.     } 
测试 
  1. import static org.junit.Assert.*; 
  2.  
  3. import org.junit.BeforeClass; 
  4. import org.junit.Test; 
  5.  
  6.  
  7. public class TestCase { 
  8.  
  9.     @BeforeClass 
  10.     public static void setUpBeforeClass() throws Exception { 
  11.     } 
  12.  
  13.     @Test 
  14.     public void testIndex() { 
  15.         new HelloLucene().index(); 
  16.     } 
  17.      
  18.     @Test 
  19.     public void testSearch(){ 
  20.         new HelloLucene().search(); 
  21.     } 

 

本文出自 “Kenan_ITBlog” 博客,请务必保留此出处http://soukenan.blog.51cto.com/5130995/1119421

原创粉丝点击