【问题标题】:Is it possible to obtain real time search results sorted by frequently updating field with Lucene 3.0 in Java是否可以在Java中使用Lucene 3.0获得按频繁更新字段排序的实时搜索结果
【发布时间】:2011-01-03 06:10:39
【问题描述】:

考虑以下假设:

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

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

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

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

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

【问题讨论】:

    标签: java search full-text-search lucene near-real-time


    【解决方案1】:

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

    更新:我还没有看到任何代码,但这是大致的想法。

    所有nw文档都会写入IndexWriter,最好用RAMDirectory创建,不会经常关闭。 (要持久保存这个内存索引,您可能需要不时将其刷新到磁盘。)

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

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

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

    【讨论】:

    • 我在哪里可以找到代码示例?我必须如何以及何时刷新 IndexReader?需要多长时间(性能)?我可以在 IndexReader 刷新时执行搜索吗?
    • 感谢您的更新。它让我概述了在 Lucene 本身中使用近实时搜索的复杂性。正如 skaffman 所说:“Lucene API 能够满足您的所有要求,但这并不容易。它是一个相当低级的 API,让它做复杂的事情本身就是一个相当大的练习”。现在我正在研究 Compass,因为它承诺会为我完成肮脏的工作;-)。
    • Lucene 2.9 中添加了实时功能。如果 Compass 有以前版本的 Lucene,您可能不会看到实时的好东西。
    • 代码实际上很简单:如果作者已经提交了任何更改 - 你应该打开新的阅读器(来自作者),以前的阅读器可以被删除/关闭。
    • 代码实际上很简单:如果任何更改已提交给其他作者 - 你应该打开新的阅读器(来自作者),以前的阅读器可以被删除/关闭。如果您需要控制快速和频繁更改的数据 - 您可以根据以下建议开发搜索:programmersought.com/article/9025109343(带有过滤阅读器的多索引阅读器 - 过滤删除的文档,使用最新添加的文档中的另一个阅读器,后台进程将这些索引合并成一个大索引)
    【解决方案2】:

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

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

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

    【讨论】:

    • 指南针看起来很有趣,所以我会尝试一下。
    • 我在哪里可以找到将一些对象(资源/文档等)添加到 Compass,然后按照指定的排序顺序进行搜索的最简单示例?我根据文档(它不是很有帮助)和 Compass 发行版中的一个示例自己尝试过,但我失败了。我不知道如何开始以及从哪里学习......
    • 指南针论坛挺好的,以前也得到过很好的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多