2

考虑以下假设:

  1. 我有 Java 5.0 Web 应用程序,我正在考虑使用 Lucene 3.0 进行全文搜索
  2. 会有超过 1000K 的 Lucene 文档,每个文档有 100 个单词(平均)
  3. 新文档必须在创建后立即可搜索(实时搜索)
  4. Lucene 文档经常更新名为 quality 的整数字段

在哪里可以找到 Lucene 3.0 近实时搜索的代码示例(简单但尽可能完整)?

是否可以获得按可能经常更新的文档字段(质量)之一排序的查询结果(对于已索引的文档)?文档字段的这种更新将不得不触发 Lucene 索引重建?这种重建的表现如何?如何有效地完成它 - 我需要一些完整解决方案的示例/文档。

但是,如果在这种情况下不一定需要重建索引 - 如何有效地对搜索结果进行排序?可能有查询返回大量文档(>50K),因此我认为从 Lucene 获取未排序的文档,然后按质量字段对它们进行排序,最后将排序列表划分为页面进行分页是效率低下的。

Lucene 3.0 是我在 Java 中的最佳选择还是应该考虑其他一些框架/解决方案?也许是 SQL Server 本身提供的全文搜索(我使用的是 PostgreSQL 8.3)?

4

2 回答 2

4

Lucene API 能够满足您的所有要求,但这并不容易。这是一个相当低级的 API,让它做复杂的事情本身就是一个练习。

我强烈推荐Compass,它是一个建立在 Lucene 之上的搜索/索引框架。除了更友好的 API 之外,它还提供了对象/XML/JSON 映射到 Lucene 索引等功能,以及完全的事务行为。它对您的要求应该没有问题,例如事务更新文档的实时排序。

Compass 2.2.0 基于 Lucene 2.4.1 构建,但基于 Lucene 3.0 的版本正在开发中。不过,它已从 Lucene API 中充分抽象出来,因此转换应该是无缝的。

于 2010-01-09T21:50:58.300 回答
1

自 2.9 起,Lucene 中提供了近实时搜索。Lucid Imagination 有一篇关于此功能的文章(在 2.9 版本之前)。基本思想是您现在可以从 IndexWriter 获取 IndexReader。如果您定期刷新此 IndexReader,您可以从 IndexWriter 获得最新的日期更改。

更新:我还没有看到任何代码,但这是一个广泛的想法。

所有的 nw 文档都将写入一个IndexWriter,最好是用 创建的RAMDirectory,不会经常关闭。(要保留此内存索引,您可能需要偶尔将其刷新到磁盘。)

您将在磁盘上有一些索引,将在这些索引上创建单独的 IndexReader。可以在这些 Reader 之上创建 MultiReader 和 Searcher。其中一个 Reader 将来自内存索引。

每隔一段时间(比如几秒钟),您将从 MultiReader 中删除当前的 Reader,从 IndexWriter 中获取新的 Reader,并使用一组新的 Reader 构造 MultiReader/Searcher。

根据 Lucid Imagination 的文章(如上链接),他们已经尝试每秒写入 50 个文档,而没有严重减速。

于 2010-01-10T05:40:47.550 回答