2014-01-17 89 views
0

我一直在成功使用elasticsearch一年左右,因此我一直在裝載數百萬個文檔,並針對這些數據運行各種查詢和構面。在elasticsearch中更新文檔的效率

我最近一些用戶問我是否可以'將文檔標記爲已讀',因此可以將它們排除在搜索結果之外。

我已經成功實現了這個沒有問題,但現在我想知道如果我選擇了最好的實現。我的理解是,更新ES中的文檔(或任何lucene實現)實際上與刪除和重新編制索引相同。

我對lucene/ES社區的問題......他們會因爲將用戶驅動的臨時任務更新文檔而產生任何負面影響嗎? (你能提出替代?)

感謝, JayTee

回答

1

是的,會有重新索引性能開銷。在http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/(這裏它談論的是一個嵌套的文檔,但是更新一個正常的文檔(沒有嵌套字段的文檔)是相同的「不可忽略的」)。

「如果數據經常變化,嵌套文檔可以有重新索引相關的不可忽略的開銷「

另一種是,在本文後面給出的 - 即父/子

」。父/子被分離的兩個文件,只有鬆散的耦合它們消除了這一限制...意味着您可以更自由地更新/刪除兒童文檔,因爲它們對父母或其他孩子沒有任何影響。

缺點是......(查詢)..不是很快,因爲它們不在同一個Lucene塊中。「

因此,如果每個文檔都會最終更新爲」讀取「 - 這將涉及重新索引整個數據存儲的開銷。如果這種情況會隨着時間的推移慢慢發生,也許你的架構可以處理它。

如果您擔心大量文檔可能被標記爲已讀,並且會在您的系統上創建大量負載,則可以爲讀取字段使用父子關係。但會有(因爲我明白一個小問題)運行查詢的額外開銷「只給兒童字段'讀'是假的文檔」

+0

很酷,感謝您的建議。我會看看父母/孩子。 – JayTee

相關問題