2012-07-05 62 views
0

我有一個包含文檔列表的應用程序。這些文件是使用Lucene索引的 。 我可以搜索文檔的關鍵字。我循環了TopDocs並獲得了與我的 關係數據庫中的ID列相關的每個Lucene doc的 ID字段。從所有這些ID中,我創建一個列表。 建築ID的名單後,我會把它執行 數據庫查詢下面的SELECT語句(JPA):將Lucene搜索結果與關係數據庫進行映射

SELECT d From Document WHERE id IN (##list of ID's retrieved from Lucene##) 

的文檔此列表發送到視圖(GUI)。

但是,一些文件是私人的,不應該在列表中。因此, 我們在SELECT查詢一些額外的語句,做一些安全 檢查:

SELECT d From Document WHERE id IN (##list of ID's retrieved from Lucene##) 
AND rule1 = foo 
AND rule2 = bar 

但現在我想知道:我使用Lucene的速度快速搜索 文件,但我仍然必須做SELECT查詢。所以我失去了 表現在這一個:-(... 是否有一些組件可以爲你做這個映射?或者 有關於這個問題的任何最佳實踐?大項目如何將Lucene 結果映射到關係型數據庫?因爲視圖應該渲染 結果?

非常感謝!

約亨

+1

你擔心什麼樣的表現打擊? Lucene是用於索引的,理想情況下,你將擁有一個數據庫或文件系統。如果Lucene下的關係數據庫是您系統其餘部分的合適選擇,那麼您描述的是正確的做事方式。 – dfb 2012-07-05 20:07:11

+0

嗯,我想我可以使用Lucene,所以我不需要一個MySQL查詢。只需從Lucene索引中獲取所有Document屬性/細節。但由於額外的檢查,我們需要執行額外的MySQL查詢。 – 2012-07-10 10:21:23

回答

0

幾點建議:

  • 在Lucene中,你可以使用一個Filter根據自己的規則來縮小搜索結果。
  • 將主鍵或唯一鍵(ID,序列號等)存儲在Lucene中。然後,您的關係數據庫可以進行獨特的密鑰查找並使事情變得非常快速。
  • Lucene也可以充當您的文檔存儲。如果適用於您的情況,您只需從Lucene中檢索各個文檔的內容,而無需轉至關係數據庫。
+0

Lucene可以存儲一個Java對象嗎?因爲你告訴我:「Lucene也可以用來存儲你的文檔」。 Document.java是一個擁有我的實際文檔(PDF,TXT,...)的一些屬性的類。我認爲你指的是文檔的文本表示,而不是Java對象... – 2012-07-10 10:14:44

+0

是的。對於每個文檔的每個字段,Lucene可以將該字段的內容存儲爲Java字符串或字節數組。查看[Field類的javadoc](http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/document/Field.html)。如果您有一些平面文本(例如純文本或HTML),則Lucene可以將其存儲爲字符串。或者,如果您有Java對象,則可以將其序列化(例如,使用ObjectOutputStream和ByteArrayOutputStream)到一個字節數組中,並且Lucene可以存儲該字節數組。然後,在搜索時,一旦擁有文檔ID和字段名稱,就可以向Lucene提供字符串/字節數組。 – 2012-07-10 17:33:26

+0

謝謝!那很有意思 – 2012-07-11 08:27:21

0

你爲什麼不數據庫使用Lucene來索引的表?這樣,你可以做1 lucene查詢中的所有內容。

+0

安全限制不在1個單獨的表中。安全規則傳播到我的數據庫中(進入其他表格 - 我很抱歉,我的第一篇文章並沒有那麼清楚)。如果所有規則都在Document表上,那麼我可以存儲規則並執行一個Lucene查詢 – 2012-07-10 10:16:59

0

如果這是一個大問題,也許值得看看ManifoldCF,它支持可能符合您需要的文檔級安全性。

+0

謝謝Persimmonium,很有趣!:-) – 2012-07-10 10:17:45