2009-06-23 75 views
0

我需要索引大量的Java屬性和清單文件。索引屬性文件

文件中的數據只是鍵值對。

我想爲此使用Lucene。

但是,我不需要任何真正的全文搜索功能,因爲數據結構比較完整。我只需要搜索屬性值的精確匹配,並且屬性密鑰總是已知的。不需要標記,也沒有「默認」字段。唯一屬性鍵的數量可能相當大。

我還應該補充一點,我希望能夠將索引完全保留在內存中(在Lucene中將是RAMDirectory)。

那麼,Lucene(主要是一個全文搜索引擎)仍然是一個很好的匹配,或者做一些其他更合適?

更新: 一個簡單的HashMap不會做,因爲我想找到定義屬性的值作爲B.這將需要至少一個嵌套HashMap中持有的三元組(鍵,值的文件,文件名 )。

+0

鍵 - 值對的數量是否足以排除內存中的散列表?您可以將它們編入索引到嵌入式SQL服務器。 – akarnokd 2009-06-23 10:49:26

+0

是的,我想過嵌入式SQL。問題是我不能使用鍵作爲列,因爲它們很多並且不知道它是否提前,所以它需要是一個鍵 - 值映射表。 – Thilo 2009-06-23 13:25:09

+0

你爲什麼要使用鍵作爲列?只需要一個(文件,鍵,值)三元組。 – akarnokd 2009-06-24 21:17:59

回答

2

是的,每個關鍵字都有一個非標記化字段的Lucene索引會執行這個技巧。這也有點矯枉過正,某種Map結構可能足以滿足你所描述的內容。

在這裏使用Lucene的主要好處是可以將細節抽象爲相當簡單的API。

+0

單個非標記字段?這不會是每個屬性的獨立字段嗎? – Thilo 2009-06-23 13:26:17

0

我會從一個簡單的HashMap開始,如果遇到內存問題,那麼就移動到像Lucene這樣更復雜的東西。您會驚訝HashMap的效率如何。

如果你想開始非常簡單,只需使用Properties對象本身 - 它是HashTable的一個實例(請參閱HashMap vs HashTable)。您可以使用load(Inputstream)輕鬆地將多個屬性文件加載到一個簡單對象中,然後如果您決定嘗試使用new HashMap(propertiesObject)的HashMap進行切換。

0

如果你不需要全文搜索,只想表示一個大的鍵值映射,那麼我建議Lucene是不合適的。

我建議像EhCache這樣的東西,它允許你在RAM中保存大塊數據,但是如果它變得太大,可以將其移出到磁盤文件。

0

看看jdbm - 它是一個輕量級的開源對象數據庫,它具有快速的B + Tree實現,可以爲您工作。如果您不需要高可靠性,則可以關閉數據庫的日誌部分(這會使插入速度更快,如果在寫入過程中出現電源故障,則可能會損壞數據庫)。

我們已經在幾個生產項目中使用了jdbm,現在已經有了4年或者5年的時間,並且有了真正的大數據集。

但是,如果您可以將整個索引保存在內存中,那麼最好使用TreeMap(如果您還需要執行反向索引,則使用多個TreeMaps),並且如果需要保存則將其序列化磁盤。