2016-09-23 83 views
1

我正在爲從數據庫獲得的值創建一個Lucene索引。我已將Index OpenMode設置爲OpenMode.CREATE_OR_APPEND如何避免在Lucene 6.0中重複文檔索引

索引創建步驟是Spring Batch Job的一部分。

我的理解是,當我第一次運行作業,索引可能需要一段時間,但是當我再次重新運行該作業的同樣不變的源數據,應該是快,因爲文件已經存在,那麼更新或INSERT尚未執行。

但對於我的情況,隨後的索引嘗試相同的不變的源數據變得越來越慢。

this question的回答表示將根據一個術語自動處理

我不知道如何在我的例子中定義術語來處理這個問題?

下面是我的示例代碼,

 public Integer createIndex(IndexWriter writer, String str, LuceneIndexerInputVO luceneInputVO) throws Exception { 
      Integer count = 0; 
      Document d = null; 
      txtFieldType.setTokenized(false); 
      strFieldType.setTokenized(false); 

      List<IndexVO> indexVO = null; 

      indexVO = jdbcTemplate. 
        query(Constants.SELECT_FROM_TABLE1, 
          new Object[] {luceneInputVO.getId1(), luceneInputVO.getId2(), str}, 
          new IndexRowMapper()); 

      while (!indexVO.isEmpty()) { 
       d = new Document(); 
       d.add(getStringField(Constants.ID, String.valueOf(luceneInputVO.getId()))); 
       ..... 
       .... 
       writer.addDocument(d); 
       indexVO.remove(indexVO.get(count)); 
       count++; 
      } 
      return count; 
     } 

我應該在上面的代碼變化時,在源數據沒有變化不執行索引?

我是Lucene的初學者,不確定如何定義Term這將決定重複性。

如果索引中已經存在完全相同的Document,我不希望索引被重新創建,並且希望新的Document被跳過(不要執行任何操作)。

編輯 -我問了一個很長的問題,但SO閱讀一些Lucene的相關問題後,我意識到,我只是要求增量索引辦法同時注重複製避免提供的文件是一個RDBMS的行表具有主鍵。如果數據庫行已更改,請更新文檔,否則不要添加新文檔。

Question 1Question 2

+0

'id'字段標識文檔。如果沒有唯一的ID,那麼您需要在導入前使用自己的邏輯進行檢查。 –

+0

我該如何編寫'Document'的'id'。在這種情況下,所有「Fields」組合標識一個「Document」。我想,我需要定義一些類似'新術語(...,...)' –

+0

不,如果您使用的是SolrJ,指定文檔的id,只需創建一個'SolrInputDocument',並設置id字段'doc.setField( 「ID」,...);' –

回答

4

我已經驗證了在Lucene的6.0.0,IndexWriter.updateDocument(Term term,Document doc);增加了一個新的文件,如果文件不存在,並更新現有文件,如果發現按term

對於我的要求,我定義了一個key字段,它基本上是Document所有其他值字段的串聯。這樣key識別內容明智的重複,即對於具有相同的key的兩個文檔意味着文檔是內容明智的重複。

我構建term要傳遞給IndexWriter.updateDocument(Term term,Document doc);這個key價值,只是調用IndexWriter.updateDocument(Term term,Document doc);代替IndexWriter.addDocument(Document doc)解決問題。