2012-01-25 46 views
1

我們在我們的應用程序中使用Lucene的近實時搜索功能進行全文搜索。由於提交是昂貴的,比如我們承諾在每添加10個文檔之後進行索引(我們預計每小時索引150到200個文檔)。現在,如果我想終止我的進程,我如何確保在進程被終止之前內存中的所有文檔都已提交到磁盤?有沒有在這裏推薦的方法?或者是我的文檔量太少了,我應該承諾每增加一項?如何用Lucene NRT Reader/Writer優雅地終止進程?

我應該跟蹤所有未提交的文檔嗎?如果進程在提交到磁盤之前被終止,那麼當進程啓動時,我應該將這些未提交的進程重新編入索引嗎?

Lucene NRT用於運行嵌入式Jetty的進程。發送關閉命令(調用某個servlet)到jetty並等待所有文檔被提交然後使用System.exit()終止是否是正確的方法?

回答

0

您可以添加一個鉤子來提交servlet的destroy方法中的所有緩衝文檔,並確保在調用System.exit(可能通過向JVM添加shutdown hook)之前關閉嵌入的servlet容器。

但這仍然不完美。如果你的進程被殺死了,所有的緩衝數據將會丟失。另一個解決方案是使用軟提交。軟提交是便宜的提交(不執行fsync),因此如果您的進程被終止,則不會丟失任何數據(但如果服務器意外關閉,數據仍可能丟失)。

綜上所述:

  • 關閉掛鉤
    • 最佳吞吐量如果進程就會被殺死
  • 數據可能丟失提交
    • 沒有數據會丟失,如果過程中遇難
    • 如果服務器關閉個
    • 可能會丟失數據意外
  • 硬提交(默認)
    • 在無數據丟失的所有
    • 慢(需要執行的fsync)
+0

你如何在lucene中做軟提交?在Google上搜索時找不到任何資源。 – naresh

+0

對不起,這是一個Solr專用功能。我認爲它也可以在Lucene中使用,但它不是,這意味着如果你想使用它,你將不得不自己實現它。你可以在http://wiki.apache.org/solr/UpdateXmlMessages上閱讀一些關於它的文檔,以及https://issues.apache.org/jira/browse/SOLR-2193上的一些技術文檔(最新的補丁包含軟提交的工作實現)。 – jpountz