2010-10-08 87 views
0

我想加快索引10GB數據到Lucene索引。 TPL是否是一個很好的方法來做到這一點?我需要將數據分成塊,然後讓每個線程開始索引塊嗎?使用並行擴展索引Lucene

爲了保持UI的響應能力BackgroundWorker是最好的方法,或任務,或其他?

SOLR已經做了這樣的事情嗎?或者自己編寫代碼還是值得的。

回答

1

如果你想多線程寫入到一個單一的IndexWriter然後我只產卵一個線程這確實有點像

Parallel.ForEach(docs, d => { writer.Add(d,analyzer) }); 

使.NET涉及分裂的數據。

在大的索引尺寸下,有些人在找到多個索引後找到性能改進,然後將所有索引合併在一起。我的理解是,這隻對真正的海量索引非常有用,但如果你想這樣做,那麼你可能需要處理自己分裂的數據。在這種情況下,使用像tpl這樣功能更全面的庫可能會很有用。

Solr本質上是多線程的,所以你會像我之前給你的那樣完成相同的代碼片段,除了不是直接調用writer,而是調用你的REST/SolrNet方法。

作爲一般規則,如果您問「我應該使用Solr還是自己製作?」答案几乎總是「使用Solr」。我想不出有什麼理由想要在這裏自己創建它,除非你的jvm真的很糟糕,或者你真的討厭java。

2

假設你正在使用Java - 我有很好的使用多線程索引的經驗。根據我的經驗,Lucene索引基本上是CPU綁定的,這意味着如果您生成N個線程,則可以使用所有N個內核。

Lucene IndexWriter處理併發性,因此您不必擔心這一點。只要準備好,你的線程就可以撥打indexWriter.addDocument

在一個項目中,文檔來自數據庫的SELECT語句。我創建了N個線程,每個線程都從ResultSet中獲取下一個文檔並將其添加到索引。當沒有更多行並且主線程在CountDownLatch上等待時,線程退出。

第二個項目有點複雜。該系統正在「抓取」一系列文件,即從一開始就不清楚會有多少文件。所以有必要保留已經發現的文件的「隊列」。在分析和索引這些文檔的過程中,可以發現更多的文檔,然後將其添加到隊列中。該隊列在開始時填入了初始/種子文檔。我創建了一個類AutoStopThreadPool來管理線程,如果您願意,歡迎您到download。 (JVM線程池需要「添加」所有任務,然後「等待完成」,這是不適合的,因爲任務的處理可能導致發現新的任務)