2010-01-09 55 views
2
獲得通過頻繁地更新場使用Lucene 3.0排序實時搜索結果

考慮以下假設:是否有可能在Java中

  1. 我有Java 5.0中的Web應用,我正在考慮利用Lucene 3.0全-text搜索
  2. 將有超過1000K Lucene的文件較多,創建只是後,他們每100個字(平均)
  3. 新的文件必須是可搜索(實時搜索)
  4. Lucene的文件經常更新的整型字段命名質量

哪裏可以找到Lucene 3.0近實時搜索的代碼示例(簡單但儘可能完整)?

是否有可能獲得按照可能經常更新的文檔字段(質量)之一排序的查詢結果(對於已編入索引的文檔)?文件字段的這種更新將不得不觸發Lucene索引重建?這種重建的表現如何?如何高效地完成它 - 我需要一些完整解決方案的示例/文檔。

但是,如果在這種情況下索引重建不一定需要 - 如何有效地對搜索結果進行排序?有些查詢可能會返回大量文檔(> 50K),所以我認爲從Lucene中獲得未排序的文檔並將其按質量字段進行排序效率不高,最後將排序列表劃分爲頁面進行分頁。

Lucene 3.0是我在Java中的最佳選擇還是應該考慮其他一些框架/解決方案?也許全文搜索由SQL Server本身提供(我使用的是PostgreSQL 8.3)?

回答

4

Lucene API能夠滿足您所要求的一切,但這並不容易。這是一個相當低級的API,並且讓它做複雜的事情本身就是一個練習。

我強烈推薦Compass,這是一個建立在Lucene之上的搜索/索引框架。除了一個非常友好的API之外,它還爲Lucene索引提供了對象/ XML/JSON映射等功能,以及完全的事務行爲。它對您的要求應該沒有問題,例如對事務更新的文檔進行實時分類。

指南針2.2.0基於Lucene 2.4.1構建,但基於Lucene 3.0的版本正在開發中。但是,從Lucene API中抽象出來的過渡應該是無縫的。

+1

羅盤似乎很有趣,所以我會試一試。 – WildWezyr 2010-01-10 21:28:16

+0

我在哪裏可以找到向Compass添加一些對象(資源/文檔等)的最簡單示例,然後以指定的排序順序進行搜索?我根據文檔(這不是很有用)和Compass發行版中的一個例子自己嘗試過,但是我失敗了。我不知道如何開始以及從哪裏學習... – WildWezyr 2010-01-13 10:22:50

+0

指南針論壇非常好,我在過去得到了很好的幫助。 – skaffman 2010-01-13 10:36:26

1

近實時搜索可在Lucene since 2.9。 Lucid Imagination有關於此功能的an article(2.9發佈之前)。基本的想法是你現在可以從IndexWriter獲得一個IndexReader。如果以固定的時間間隔刷新此IndexReader,則最多可獲得IndexWriter的日期更改。

更新:我還沒有看到任何代碼,但這裏是一個廣泛的想法。

所有新文檔將被寫入IndexWriter,最好使用RAMDirectory創建,這將不會經常關閉。 (要堅持這種內存索引,您可能不得不將其刷新到磁盤。)

您將在創建單獨的IndexReader的磁盤上有一些索引。 MultiReader和Searcher可以在這些讀者之上創建。讀者之一將來自內存中的索引。

以固定的時間間隔(比如說幾秒鐘),您將從MultiReader中刪除當前的Reader,從IndexWriter中獲取新的Reader,並用新的讀取器組構建MultiReader/Searcher。

根據來自Lucid Imagination的文章(與上文相關),他們試圖每秒寫入50個文件,沒有嚴重放緩。

+0

我在哪裏可以找到代碼示例?如何和何時exacly我必須refesh IndexReader?需要多長時間(表演)?我可以在IndexReader更新時執行搜索嗎? – WildWezyr 2010-01-10 21:48:04

+0

感謝您的更新。它給我介紹了在Lucene中使用接近實時搜索的複雜性。正如skaffman所說:「Lucene API能夠滿足你所要求的所有事情,但這並不容易,它是一個相當低級的API,並且使它變得複雜,這本身就是一個練習。現在我正在研究Compass,因爲它承諾爲我做這個骯髒的工作;-)。 – WildWezyr 2010-01-11 11:22:51

+0

Lucene 2.9中添加了實時功能。如果Compass擁有以前版本的Lucene,那麼您可能不會看到實時的好東西。 – 2010-01-12 06:51:36