2011-06-19 30 views
2

我的Lucene Java實現正在吃掉太多的文件。我遵循了Lucene Wiki中關於太多打開文件的說明,但這隻能幫助減緩這個問題。這裏是我的代碼對象(PTicket)添加到索引:Lucene Java打開太多文件。我正確使用IndexWriter嗎?

//This gets called when the bean is instantiated 
public void initializeIndex() { 
    analyzer = new WhitespaceAnalyzer(Version.LUCENE_32); 
    config = new IndexWriterConfig(Version.LUCENE_32, analyzer); 

} 


public void addAllToIndex(Collection<PTicket> records) { 
    IndexWriter indexWriter = null; 
    config = new IndexWriterConfig(Version.LUCENE_32, analyzer); 

    try{ 
     indexWriter = new IndexWriter(directory, config); 
     for(PTicket record : records) { 
      Document doc = new Document(); 
      StringBuffer documentText = new StringBuffer(); 
      doc.add(new Field("_id", record.getIdAsString(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.add(new Field("_type", record.getType(), Field.Store.YES, Field.Index.ANALYZED)); 

      for(String key : record.getProps().keySet()) { 
       List<String> vals = record.getProps().get(key); 

       for(String val : vals) { 
        addToDocument(doc, key, val); 
        documentText.append(val).append(" "); 
       } 
      } 
      addToDocument(doc, DOC_TEXT, documentText.toString());   
      indexWriter.addDocument(doc);  
     } 

     indexWriter.optimize(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     cleanup(indexWriter); 
    } 
} 

private void cleanup(IndexWriter iw) { 
    if(iw == null) { 
     return; 
    } 

    try{ 
     iw.close(); 
    } catch (IOException ioe) { 
     logger.error("Error trying to close index writer"); 
     logger.error("{}", ioe.getClass().getName()); 
     logger.error("{}", ioe.getMessage()); 
    } 
} 

private void addToDocument(Document doc, String field, String value) { 
    doc.add(new Field(field, value, Field.Store.YES, Field.Index.ANALYZED)); 
} 

編輯添加的代碼搜索

public Set<Object> searchIndex(AthenaSearch search) { 

    try { 
     Query q = new QueryParser(Version.LUCENE_32, DOC_TEXT, analyzer).parse(query); 

     //search is actually instantiated in initialization. Lucene recommends this. 
     //IndexSearcher searcher = new IndexSearcher(directory, true); 
     TopDocs topDocs = searcher.search(q, numResults); 
     ScoreDoc[] hits = topDocs.scoreDocs; 
     for(int i=start;i<hits.length;++i) { 
      int docId = hits[i].doc; 
      Document d = searcher.doc(docId); 
      ids.add(d.get("_id")); 
     } 
     return ids; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

此代碼是一個Web應用程序。

1)這是建議的方式來使用IndexWriter(實例化每個添加索引新的一個)?

2)我讀過提高ulimit會有所幫助,但這看起來像是一種無法解決實際問題的創可貼。

3)問題可能出在IndexSearcher上嗎?

+0

只是增加服務器上的文件描述符的數量 –

回答

3

1)這是使用 的IndexWriter(實例每一個新 添加到索引)的建議呢?

我建議不,有constructors,它會檢查是否存在或創建一個新的作家,在包含索引的目錄。如果您重新使用編輯器,問題2將被解決。

編輯:

好吧,似乎在Lucene的3.2最,但一個構造函數棄用,因此IndexWriter類的resue可以通過枚舉IndexWriterConfig.OpenMode與價值CREATE_OR_APPEND來實現。

也,開闢新的作家和關閉每個文檔添加效率不高,我建議再利用,如果你想加快索引,設置setRamBufferSize默認值是16MB,因此通過試錯法做

從文檔:

注意,您可以用 打開索引創建使用index =真實的,即使當讀者 。老讀者將 繼續搜索他們已經打開的「時間點」 快照,並不會 看到新創建的索引,直到他們 重新打開。

還重用IndexSearcher的,我不能看到代碼搜索,但IndexSearcher的是線程安全的,可以用來作爲Readonly以及

此外,我建議你對作家使用合併因子,這是沒有必要的,但將有助於限制上倒排索引文件的創建,做到這一點通過試錯法

+0

IndexWriter的所有構造函數在Lucene 3.2中已被棄用,除了我正在使用的構造函數。我會檢查IndexSearcher – gmoore

+0

@gmoore:chk update – Narayan

+0

有誰知道爲什麼這種IndexWriter的構造方法已被棄用 –

1

我想我們需要查看您的搜索代碼以確定,但我懷疑它是索引搜索器的問題。更具體地說,確保您的索引閱讀器在完成後正確關閉。

祝你好運,

+0

我沒有關閉IndexSearcher,因爲Lucene說沒關係。從他們的Wiki中「確保您只打開一個IndexSearcher,並在所有正在執行搜索的線程中共享它 - 這是安全的,並且會最大限度地減少開放的文件數量。」謝謝,不過。 – gmoore

0

科學正確的答案是:你不能真正通過這個代碼片段告訴。

的更有建設性的答案是: 你必須確保只有一個的IndexWriter在任何給定的時間寫的索引,而爲此需要一些機制來確保這一點。所以我的答案取決於你想完成什麼:

  • 你想更深入地瞭解Lucene嗎?或..
  • 你只是想建立和使用索引?

如果你的答案是後者,你可能想看看像Solr這樣的項目,它隱藏了所有的索引讀寫。

+0

我只是想構建並使用索引,我不想使用Solr。我會研究多個IndexWriters。 – gmoore

0

這個問題大概是 Too many open files Error on Lucene

重複我在這裏重複我的答案這一點。

使用複合索引來減少文件數量。當這個標誌被設置時,lucene會將一個段寫成單個.cfs文件而不是多個文件。這將顯着減少文件數量。

IndexWriter.setUseCompoundFile(true) 
+1

Lucene FAQ說默認情況下setUseCompoundFile是true 1.4 http://wiki.apache.org/lucene-爪哇/ LuceneFAQ#Why_am_I_getting_an_IOException_that_says_.22Too_many_open_files.22.3F – gmoore