2012-09-27 61 views
3

考慮以下情況。我們有一個數據庫,可以在兩個獨立的表格中存儲作者和書籍。有一本書明顯存儲了撰寫這本書的作者的參考。 對於Solr,我必須將這個結構非規範化爲一個大的文檔,其中每本書都包含與作者相關的細節。此索引現在用於查詢書籍。參考數據的Solr反規範化和更新

系統的一個用戶現在決定更新系統中的作者記錄。因爲許多書可以與它關聯,所以我必須更新Solr中的每個文檔,這些文檔都嵌入了此作者記錄中的數據。這是非常痛苦的,因爲據我所知,我必須刪除並重新添加每個受影響的文檔。

有沒有更好的方法來做到這一點?如果引用的數據之一被修改,我需要在系統中實時更新索引。

回答

2

這將是嵌套文檔的完美用例。據我所知,lucene確實支持嵌套文檔,但Solr不支持,不完全確定此功能的當前狀態。

儘管此功能在elasticsearch中可用。你可能想看看它,如果你想知道what's so cool about elasticsearch在我看來有一篇我剛剛寫的文章,可能會很有趣。你的問題只是提醒我,我沒有提到我的文章中的嵌套文檔功能,這也非常酷。您可以在映射中使用nested type。如果你想知道更多,你可以看看this文章。順便說一下,它包含了書籍/作者的例子。

Elasticsearch也可以幫助你,而updating documents。您無需重新編制整個文檔的索引,只需通過腳本發送更改。由於它存儲已編入索引的source文檔,因此它在內部檢索該文檔,並更新其運行腳本並將其重新編入索引。這是lucene內部工作原理,因爲它的索引段是一次編寫的。使用即將發佈的Solr 4,您可以僅提供update文檔提供更改,但據我所知,只有在存儲了所有字段的情況下,此功能纔有效。未存儲的字段無法從索引中檢索。

如果我們在談論近實時更新,elasticsearch確實使用了Lucene Near Real Time API,並且每秒都會自動刷新索引閱讀器。 Solr 3尚未使用這些API,但Solr 4卻使用這些API。

+0

謝謝,我稍後會閱讀您的博客文章。嵌套文檔看起來像我需要的東西只是不知道它存在。但是我仍然不知道它是如何加速嵌套文檔更新過程。我必須進一步調查。 – NagyI

+0

我們的目標是隻給作者索引一次,並讓書籍只指向他們而不是實際包含它們。這樣你只需要更新每個作者一次。 – javanna

+0

謝謝,這看起來很有希望。我會帶ES去試點:) – NagyI