0

lucene 3.6 検索 API を Java デスクトップ アプリケーションに統合しています。lucene システムは、ファイル システム ディレクトリを使用してインデックスを保存します。インデックス ディレクトリを作成するコード、インデックスライター、ドキュメントをインデックスに追加するコード。

インデックスのデータは、derby データベースから収集されます。データベース テーブルのフィールドはフィールドとして lucene ドキュメントに追加されます。そのため、データベース テーブルの各行は 1 つの lucene ドキュメントとして表されます。

私の質問は、インデックス ディレクトリを確認する方法があり、そこに lucene ドキュメントが入力されていない場合は入力することです。または、インデックスが既に作成されている場合に、インデックスの再作成をスキップします。

インデックス ファイルを作成するためのコード。

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

解決策のアイデア。みんなで乾杯。

4

2 に答える 2

0

次の手順のいずれかまたはすべてを試すことができます。

1) 入力する予定のインデックスに最初と最後のエントリが存在するかどうかを確認します。

2) 可能であれば、データ ソースと Lucene インデックス (ファイルの更新日) の最終更新時刻も比較できます。

3) インデックスにあるはずのエントリの数を確認できます。IndexReader.numDocs()または maxDocs() 何でも..それはあなたのユースケースに関連しています。

于 2013-05-10T18:26:45.700 に答える