2014-02-12 23 views
2

我正在運行一個非常簡單的性能實驗,其中我發佈2000文檔到我的應用程序。 誰將他們保存到關係數據庫中並將它們發送到Solr進行索引(在同一請求中同步)。solr性能與commitWithin沒有意義

我測試3用例:

  1. 沒有索引的話 - 〜45秒後2000個文件包括
  2. 索引 - 每次提交後添加。約8分鐘後和指數2000文檔
  3. 索引包括(!) - commitWithin 1毫秒〜55秒後和指數2000文檔

第三結果並沒有任何意義,我希望(!)行爲類似於第二點。起初我認爲這些文檔並沒有真正提交,但實際上我可以通過在實驗過程中執行一些查詢(通過solr Web UI)來看到它們。

我很擔心我錯過了很大的東西。是否有可能在每次添加後提交性能會降低400倍?

我用點2的代碼:

SolrInputDocument = // get doc 
SolrServer solrConnection = // get connection 
solrConnection.add(doc); 
solrConnection.commit(); 

凡爲3點代碼:

SolrInputDocument = // get doc 
SolrServer solrConnection = // get connection 
solrConnection.add(doc, 1); // According to API documentation I understand there is no need to call an explicit commit after this 

回答

2

根據這個wiki:

https://wiki.apache.org/solr/NearRealtimeSearch

的commitWithin是默認情況下的軟提交。軟提交非常有效,可以立即搜索添加的文檔。但!他們還沒有在磁盤上。這意味着這些文件正在投入到RAM中。在這個設置中,你可以使用updateLog來實現Solr實例的崩潰容限。

你在第2點做的是硬性提交,即將添加的文檔刷新到磁盤。在每次添加文檔後執行此操作都非常昂貴。所以,相反,發佈一堆文件併發佈一個硬提交,甚至讓你自動提交設置爲一些合理的價值,如10分鐘或1小時(取決於你的用戶期望)。

+1

我認爲這是Solr Wiki中唯一沒有訪問過的頁面:-) 謝謝! – Vitaliy

+0

你的意思是什麼,立即可搜索?我用commitWithin = 10000向我的索引添加了一個doc,期望它立即可用並在10秒內提交到磁盤。然而,文件並不是立即可用的,並且只有在10多年過去之後纔出現。我在這裏錯過了什麼嗎? – preslavrachev

+0

@ user1107412我相信,你混合了兩件事:soft-commit和commitWithin。 CommitWithin使用軟提交併按照您的情況行事。您可以直接使用soft-commmit,而無需commitWithin。然後,solr會立即嘗試提交,並立即讓搜索者看到文檔。 –