繁体   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