2012-09-27 22 views
1

對不起,如果我問了一個愚蠢的問題,但我找不出 解決方案。 我有存儲在mongodb中的數據,並且使用richardwilly的插件將集合映射到es 索引。然而,我的幾個索引 被搞砸了(由於其中並非我期望看到的所有數據都是 (它仍然在mongodb中))。我試圖在虛擬 數據上創建一個虛擬索引,我期望在重新索引之後,我現在將在 es中看到這些數據。一旦索引已被刪除並重新創建,Elasticsearch不會自動提取現有的mongoDB數據

這個問題似乎是蒙戈河上OPLOG工作和 之後我刪除索引,將下一首新文檔 後我想自動看到其他的數千份文件MongoDB中到 現在可見在es。但是,我只看到刪除並重新創建索引後插入的文檔 。其他 1000個文檔在mongo中仍然可見,但不在es中。

我做了一個小實驗,我看到如果我實際上重新插入了文檔,它們在elasticsearch中可見(如果索引爲 ,則允許它們全部處於允許狀態)。你可以告訴我如何我可以使mongodb中的 數據在es重新創建索引後顯示,而不必 必須刪除並重新插入,因爲我不能這樣做。我需要重新播放 oplog還是有另一種方法,你可以建議這樣的 我可以得到這些數據到ES而不刪除並重新插入?

謝謝!

回答

0

回答我自己的問題,我得到了elasticsearch社區的幫助。如果您刪除河流並創建一個新河流,那麼您映射到的集合中的所有數據都應該在elasticsearch索引中提供。

+0

不,只是重新創建這條河似乎並沒有從mongodb中批量加載數據。我認爲從mongodb獲取現有數據的唯一方法就是全部通過oplog。我在0.20.1,所以讓我知道你是否找到了不同的東西。 – coreyt

+0

由於索引仍然完好無損,因此他不需要批量加載數據。重新創建河流不會影響存儲在索引中的數據。 –

2

如您所說,MongoDB河流通過使用Mongo的oplog工作,這意味着您只能將文檔的更改索引到Elastic中。 (對Mongo索引的更改對oplog沒有影響)爲了索引在第一oplog條目之前創建的文檔,您需要找到另一種方法。

如果您不想刪除+重新插入,則可以對現有文檔執行批量更新。

或者,您可以實現一個工具,它可以在Elastic中查找第一個文檔,查詢Mongo以查找以前的任何文檔併爲缺少的文檔編制索引。

+0

如果我的OPLOG時間開始改變數據的開始插入到MongoDB的,要先做索引? 或批量更新是更好的解決方案?像添加一個標誌並刪除它? –

0

如果重新創建河流不起作用,有幾個選項。

  1. 配置並啓動副本集後,用mongodump/mongorestore重新加載數據庫。因爲河流使用oplog,所以當您創建您的河流時,如果新河要知道數據存在並且應該被索引,則數據需要通過oplog。 (這在開發環境中可能更容易實現。)

  2. 另一種可能的方式是通過導軌控制檯觸摸所有對象。同樣,請確保您的副本集已經在運行:

    $ bundle exec rails c 
    1.9.1 :001 > Person.all.each do |person| 
    1.9.1 :002 >  person.save() 
    1.9.1 :003?> end 
    
相關問題