2010-01-09 81 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