2011-03-11 104 views
11

當用戶創建文檔時,我將日期添加到solr索引。每次數據變化如編輯或刪除,我必須重新索引整個數據?如何更新solr索引?

在這種情況下reindex意味着什麼?當我爲每個文檔做

$this->indexData(array(
     'id' => $pid, 
     'title' => $data['titel'] 
)); 

$solr->addDocuments,它只是簡單地覆蓋現有的數據嗎?

我試圖在添加/刪除/編輯時重新索引整個索引,但在刪除某個字段後,其信息似乎仍然在索引中。

任何想法?

回答

23

當您將文檔索引到solr時,它將覆蓋與通常爲id的相同<uniqueKey/>的任何現有文檔。所以是的,它覆蓋了現有的數據。

當您想要更改文檔的單個字段時,您必須重新索引整個文檔,因爲solr不支持僅更新字段。所以,當你刪除一個字段時,你將不得不重新索引沒有字段的文檔。這將覆蓋現有的數據。不要忘了在最後發送一個commit

使用Solr 4,您可以更新文檔的單個字段。參見Atomic_Updates

5

++以上。

另外,如果你有這樣的變化的大批量再有就是一個潛在的問題:

當你「更新」 Solr中的文檔(如Morja說)這不是一個「到位」更新。會發生什麼是Solr維護其文檔的內部查找表,當您更新文檔時,必須保留重定向列表,以便當指向「更新」文檔的指針在倒排索引中被點擊時,它知道要去新該文件的版本。

這很好,如果你有足夠的內存,但最終Solr將需要重建查找時,它使用了內存跟蹤所有的變化。這(以我的經驗)會導致意想不到的減速和不必要的優化。

對你來說可能不是問題,但它對我來說。 (每小時更新一千次以上)

+1

有了這樣的更新量,你如何防止一個用戶覆蓋另一個用戶的編輯? – gregm 2012-06-04 09:19:07

+0

你是如何解決你的問題的? – 2013-01-30 17:05:36

0

問題可能是您沒有在更新後提交文檔(它是刪除和插入),但過於頻繁的提交可能會觸發優化,因此請小心。

您不需要重新索引整個數據,但整個文檔將不得不與更新後的文檔重新構建。