簡體   English   中英

是否可以通過Java中的Lucene 3.0獲得按頻繁更新字段排序的實時搜索結果

[英]Is it possible to obtain real time search results sorted by frequently updating field with Lucene 3.0 in Java

考慮以下假設:

  1. 我有正在考慮使用Lucene 3.0進行全文本搜索的Java 5.0 Web應用程序
  2. Lucene文檔將超過1000K,每個文檔100個字(平均)
  3. 新文檔創建后必須立即可搜索(實時搜索)
  4. Lucene文檔經常更新名為quality的整數字段

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

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

但是,如果在這種情況下不必重新構建索引-如何有效地對搜索結果進行排序? 可能有查詢返回很多文檔(> 50K),所以我認為從Lucene中獲取未排序的文檔,然后按質量字段對其進行排序,最后將排序后的列表划分為頁面進行分頁,效率不高。

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

Lucene API可以滿足您的所有要求,但這並不容易。 這是一個相當低級的API,並且使其本身做起來很復雜。

我強烈推薦Compass ,它是基於Lucene構建的搜索/索引框架。 除了更友好的API外,它還提供了諸如將對象/ XML / JSON映射到Lucene索引的功能,以及完全事務性的行為。 它不會對您的要求造成任何麻煩,例如對事務更新的文檔進行實時排序。

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

從2.9開始,Lucene中提供了近實時搜索。 Lucid Imagination上有一篇有關此功能的文章 (2.9版之前)。 基本思想是您現在可以從IndexWriter獲取IndexReader。 如果您定期刷新此IndexReader,則可以從IndexWriter獲取最新的日期更改。

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

所有的nw文檔都將被寫入IndexWriter ,最好由RAMDirectory創建,它將不會經常關閉。 (要保留此內存索引,您可能必須偶爾將其刷新到磁盤。)

您將在要創建單個IndexReader的磁盤上有一些索引。 可以在這些閱讀器的頂部創建一個MultiReader和一個Searcher。 讀者之一將來自內存索引。

以固定的時間間隔(例如幾秒鍾),您將從MultiReader中刪除當前的Reader,從IndexWriter獲取新的Reader,並使用一組新的Reader構建構造MultiReader / Searcher。

根據Lucid Imagination的文章(上面有鏈接),他們嘗試了每秒寫入50個文檔,而速度沒有很大的下降。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM