2011-12-05 67 views
2

我正在考慮使用Lucene爲網站提供搜索功能。Lucene搜索不同的對象模型

網站包含幾個不同的對象模型(例如論壇,民意調查等),我想能夠讓搜索翻過不同的對象模型(即搜索論壇和|或調查)

我有兩個(有點相關)的​​問題:

  1. 對象是否需要提供一致的(即與Lucene相同的接口)? - 例如,所有要作爲索引的對象是否應具有id,title,content等屬性,或者每個對象是否可以存儲不同的數據字段?

  2. 用戶需要什麼語法才能搜索某個特定關鍵字(僅作爲示例或輪詢AND論壇[作爲示例])?

我正在使用Lucene的PHP端口。

回答

0

Lucene使用「文檔」的概念,它是Lucene索引中的條目。每個文檔都有幾個「字段」,它們包含實際的數據。您將能夠搜索添加到Lucene索引的任何內容,但使用允許將查詢結果與您的模型實例進行匹配的標識符創建這些條目非常重要。

這意味着,如果你的數據在關係數據庫中,並且正在使用數字ID,那麼使用Lucene創建的索引條目必須包含相應的標識符和「類型」(例如,表),這將允許您知道該id對應的實例。

至於語法,Lucene提供了一個非常好的谷歌般的查詢語法。您如何創建您的Lucene文檔/索引條目將決定您的查詢如何表達。

+0

這是一個非常高層次的概述 - 這是我目前擁有的。我正在尋找的是關於如何實際實現所需功能(最好帶有一些僞代碼/代碼片段)的細節,而不必從封面到封面閱讀整個Lucene手冊。 –

3

您有2個選項。

  1. 爲每種類型的文檔(論壇,投票等)創建單獨的索引。優點是,查詢更簡單,文檔更簡單,匹配更準確(您的字段規範化不受其他文檔數據的影響)。缺點是不得不保持單獨的指數,有不同的文件。

  2. 創建一個索引。您存儲的文檔將是要查詢的所有對象的所有字段的並集。您添加一個額外的字段,即您正在存儲的類型(論壇,投票等)。然後,當查詢時,您按類型過濾以僅獲得您想要的結果。優點,單個文件/索引來維護。缺點是,你可能會在共享字段上產生一些串擾,導致搜索結果偏斜。

澄清我在上面2中提到的缺點。 Lucene的內在權重是「稀有」的。如果您有一個使用罕見術語的查詢,並且該術語僅出現在幾個文檔中,那麼這些文檔將向搜索結果頂部冒泡。如果您在工會中的兩個不同文檔之間共享一個字段,那麼可能會(並非總是)是搜索結果權重不同的情況,而且這對最終用戶來說是顯而易見的。

我傾向於選項1的正確性,2爲便於維護。這是一種折衷。

編輯:如果你想支持在單個查詢中查詢多種類型,選項2是可取的。這是您能夠混合來自不同文檔類型的結果的唯一方法。由於評分算法,查詢2個索引並嘗試以某種方式排列結果幾乎是不可能的。