2013-05-10 97 views
0

我正在將lucene 3.6搜索API集成到Java桌面應用程序中。 lucene系統使用文件系統目錄來存儲索引。 創建索引目錄,索引編寫器和向索引添加文檔的代碼。填充Lucene 3.6文件目錄索引

索引的數據是從德比數據庫中收集的。數據庫表 的字段作爲字段添加到lucene文檔中。因此數據庫表中的每一行都表示爲單個lucene文檔。

我的問題是,有沒有辦法檢查索引目錄,如果沒有用lucene文檔填充它,然後填充它。或跳過 重新填充指數,當它已經是人口。

創建索引文件的代碼。創建索引作家

public void createIndexWriter() throws IOException, SQLException 
    { 
    indexDir = createIndexDir(); 
    if(iw == null) 
      { 
      try { 
       // create some index 
       StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); 
      IndexWriterConfig IWConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer); 

      iw = new IndexWriter(FSDirectory.open(indexDir), IWConfig); 

      } 
      catch (CorruptIndexException ex) { 
       Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (LockObtainFailedException ex) { 
       Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      }  
    } 

public File createIndexDir() throws IOException, SQLException 
    {  
    //Check if directory exist 
     if(!userDir.exists()) 
     { userDir.mkdir(); 
     System.out.println(" Index directory created at " + userDir.getAbsolutePath());  
     } 
     return userDir.getAbsoluteFile(); 
    } 

代碼是從數據庫

 public void buildIndex() throws SQLException, CorruptIndexException, IOException 
    { 

    /* Connecting to the database */ 
    Connection con = DriverManager.getConnection(host, uName, uPass); 
    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
    String sql = "SELECT * FROM APP.REGISTRY"; 
    ResultSet rs = stmt.executeQuery(sql); 


    rs.beforeFirst(); //set poinyrt to begining of result set 
    while(rs.next()) 
    { 
    Document doc = new Document(); 

    doc.add(new Field("id",rs.getString("ID"),Field.Store.YES,Field.Index.NO)); 

    if(rs.getString("SUBJECT")== null) 
    { doc.add(new Field("subject","",Field.Store.YES,Field.Index.ANALYZED)); } 
    else { 
    doc.add(new Field("subject",rs.getString("SUBJECT"),Field.Store.YES,Field.Index.ANALYZED)); 
    } 

    if(rs.getString("LETTER_FROM")== null) 
    { doc.add(new Field("letter_from"," ",Field.Store.YES,Field.Index.ANALYZED)); } 
    else { 
    doc.add(new Field("letter_from",rs.getString("LETTER_FROM"),Field.Store.YES,Field.Index.ANALYZED)); 
    } 

    doc.add(new Field("date_of_letter",DateTools.dateToString(rs.getDate("DATE_OF_LETTER"), 
      DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED)); 

     doc.add(new Field("date_received",DateTools.dateToString(rs.getDate("DATE_RECEIVED"), 
      DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NO));    

    if(rs.getString("REMARKS")== null) 
    { doc.add(new Field("remarks"," ",Field.Store.YES,Field.Index.ANALYZED)); } 
    else { 
    doc.add(new Field("remarks",rs.getString("REMARKS"),Field.Store.YES,Field.Index.ANALYZED)); } 

     if(rs.getDate("DATE_DISPATCHED")== null) 
    { doc.add(new Field("date_dispatched",DateTools.dateToString(new Date(0L),DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED)); } 
    else { 
    doc.add(new Field("date_dispatched",DateTools.dateToString(rs.getDate("DATE_DISPATCHED"), 
      DateTools.Resolution.MINUTE),Field.Store.YES,Field.Index.ANALYZED));  
      }  

    if(rs.getString("OFFICE_DISPATCHED_TO")== null) 
    { doc.add(new Field("office_dispatched_to"," ",Field.Store.YES,Field.Index.ANALYZED));} 
    else { 
    doc.add(new Field("office_dispatched_to",rs.getString("OFFICE_DISPATCHED_TO"),Field.Store.YES,Field.Index.ANALYZED)); 
     } 
    iw.addDocument(doc); 
    } 
    iw.commit();  
    closeIndexWriter(); 
    stmt.close(); 
    rs.close(); 
    con.close(); 
    } 

任何想法的解決方案填充了數據的索引文件的代碼。 爲所有人歡呼。

+0

請定義人口..你想如何處理人口稠密的情況? – phani 2013-05-10 16:41:30

+0

抱歉填充我的意思是創建字段和文檔並將它們添加到lucene索引。 – CodeAngel 2013-05-10 17:17:17

回答

0

您可以在索引中查詢您知道在您的Derby數據庫上的數據,包括一些樣本條目或總記錄數。如果在那裏,您不需要重新填充索引。

0

您可以嘗試以下任何/所有步驟。

1)檢查您計劃填充的索引中是否存在第一個和最後一個條目。 2)如果可能,您還可以比較數據源和Lucene索引(文件更新日期)的最新更新時間。

3)您可以檢查應該在索引中的條目數。 IndexReader.numDocs()或maxDocs()任何..這與您的用例有關。