2015-09-25 46 views
3

我有一個擁有數百萬個文檔的現有Lucene存儲,每個文檔都代表一個實體的元數據。我有幾個Id字段(Id1,Id2 .. Id5),每個文檔可以具有零個或多個此字段的值。索引一次只能由其中一個Ids查詢。我已經獨立編制了這些領域的索引,這一切都很好。我最初選擇使用Lucene,因爲它是迄今爲止查詢如此大量小文檔的最快方式,我對我的決定感到滿意。如何在Lucene中存儲多個不同類型的文檔

但是現在我必須存儲另一種類型的文檔,這些文檔也代表實體的不同類型的元數據,並且具有(Id1,Id2,Id5)的值,並且這些文檔還將分別由這些Ids中的一個查詢。現有的元數據和這組新數據將彼此獨立存儲和查詢。

如何通過Id查詢Lucene,但僅查詢一種類型的文檔。我可以考慮一些選項,但我想知道那些知道的人從經驗中推薦的內容,以便讓Lucene保持可管理性和快速性。

  1. 使用單獨的Lucene索引。這將避免這個問題,因爲文檔類型是正交的。還有能夠分別讀取和寫入索引的好處。
  2. 將新文檔的字段Id1..Idn重命名爲XId1 ... XIdn。這樣,一種類型的文檔就不會與另一種類型的文檔具有相同的字段名稱。這似乎更像是一種避免問題的解決方法,而不是實際的解決方案。
  3. 添加一個數字字段「Type」並將索引號更改爲(Type,Idx)。這種方法看起來很浪費,因爲每個索引都必須包含該類型。

我能夠打破向後兼容性與我現有的設置。如果我添加其他文檔類型,如果解決方案可以重複使用,那將是非常好的。

+0

我會做1.但更多隻是意見 – Paparazzi

回答

4

由於type指數的選擇性低,我肯定會拒絕第三種選擇。在type字段中只有兩個不同的值,每個字段有數百萬個文檔。 Lucene需要將這個龐大的發佈列表與來自idN索引的簡短髮佈列表合併,該列表仍然可以非常快速,但確實很浪費。

前兩種方式在查詢階段是完全相同的,因爲您對獨立類型的文檔有不同的術語和發佈列表。差異將在索引階段。管理多個獨立索引需要更多的協調,並使代碼更加困難。然而,如果您有計劃在不同的環境下使用索引,那麼這可能是一個好主意。例如:

  • 物理位置;
  • 備份策略;
  • 可用性要求;
  • 時間對指數的需求(時間從一個文檔在客戶端改變,直到可見指數)

否則,我會第一個選擇,因爲更簡單,便於管理去。

+0

事實證明,我選擇了第一種方式,後來我發現後來確實需要不同的備份策略和可用性要求。謝謝 – andrewjs

相關問題