2010-07-13 205 views
2

我想使用Lucene索引現有數據庫中的表。我一直在思考的過程是這樣的:Lucene索引

  1. 在表
  2. 商店每列創建一個「場」的所有字段
  3. 「分析」所有的,除了與主鍵字段的字段
  4. 將表中的每一行作爲Lucene Document存儲在表中。

儘管此表中的大多數列都很小,但其中一個很大。該列也是包含執行搜索的大部分數據的列。

我知道Lucene提供了一個不存儲字段的選項。我想兩種解決方案:

  1. 存儲領域,無論大小,並且如果找到命中的搜索,從文件讀取相應的字段
  2. 不要存放場及如果命中發現搜索,查詢數據庫來獲得相關信息進行

我知道有可能不是一個放之四海而皆準的答案...

回答

2

可以肯定,你的系統將是如果有更多的反應你在Lucene上存儲所有的東西。存儲字段不會影響查詢時間,它只會使索引的大小更大。如果只有一小部分數據量很大的行可能不會那麼大。因此,如果索引大小對您的系統不是問題,我會隨之去做。

+1

對帕斯卡的迴應+1。你也可以標記大字段並*不存儲*它。通過這種方式,您可以在字段上查詢(搜索),獲取相關文檔/記錄標識符並從數據庫中檢索記錄。 – Mikos 2010-07-14 00:20:11

+0

感謝您的回覆。 如果我選擇不存儲任何字段,我也將無法使用突出顯示(Lucene contrib模塊)來突出顯示搜索結果? – 2010-07-14 16:27:07

+0

可以在不存儲文本的情況下完成,但這不是簡單的方法。參見http://www.lucidimagination。com/search/document/5ea8054ed8348e6f/highlight_arbitrary_text#60f592f5ff0de0c5 – 2010-07-14 16:37:02

1

我堅決不同意帕斯卡的回答。索引大小可能會對搜索性能產生重大影響。主要原因有:

  • 存儲字段增加索引大小。這可能是相對較慢的I/O系統的問題;
  • 當您在內存中加載文檔時,存儲的字段全部加載。這可能對GC有很大的壓力,存儲的字段可能會影響讀者重新打開時間。

最終答案當然要看。如果原始數據已經存儲在其他地方,最好從原始數據存儲中檢索它。

+1

Lucene不應被視爲權威的數據源。數據應該存儲在其他地方,所以在非存儲文本字段上使用基於關鍵字的查詢,然後查找來從單一真實來源獲取實際數據。 – Glenn 2013-04-15 06:02:41

0

當從數據庫向Lucene添加一行時,您可以判斷它是否實際需要寫入倒排索引。如果不是,則可以使用Index.NOT來避免將太多數據寫入倒排索引。 同時,您可以通過鍵值來判斷列將被查詢的位置。如果不是,則不需要使用Store.YES來存儲數據。