2010-07-13 118 views
2

我想使用Lucene索引现有数据库中的表。我一直在思考的过程是这样的:Lucene索引

  1. 在表
  2. 商店每列创建一个“场”的所有字段
  3. “分析”所有的,除了与主键字段的字段
  4. 将表中的每一行作为Lucene Document存储在表中。

尽管此表中的大多数列都很小,但其中一个很大。该列也是包含执行搜索的大部分数据的列。

我知道Lucene提供了一个不存储字段的选项。我想两种解决方案:

  1. 存储领域,无论大小,并且如果找到命中的搜索,从文件读取相应的字段
  2. 不要存放场及如果命中发现搜索,查询数据库来获得相关信息进行

我知道有可能不是一个放之四海而皆准的答案...

回答

2

可以肯定,你的系统将是如果有更多的反应你在Lucene上存储所有的东西。存储字段不会影响查询时间,它只会使索引的大小更大。如果只有一小部分数据量很大的行可能不会那么大。因此,如果索引大小对您的系统不是问题,我会随之去做。

+1

对帕斯卡的回应+1。你也可以标记大字段并*不存储*它。通过这种方式,您可以在字段上查询(搜索),获取相关文档/记录标识符并从数据库中检索记录。 – Mikos 2010-07-14 00:20:11

+0

感谢您的回复。 如果我选择不存储任何字段,我也将无法使用突出显示(Lucene contrib模块)来突出显示搜索结果? – 2010-07-14 16:27:07

+0

可以在不存储文本的情况下完成,但这不是简单的方法。参见http://www.lucidimagination。com/search/document/5ea8054ed8348e6f/highlight_arbitrary_text#60f592f5ff0de0c5 – 2010-07-14 16:37:02

1

我坚决不同意帕斯卡的回答。索引大小可能会对搜索性能产生重大影响。主要原因有:

  • 存储字段增加索引大小。这可能是相对较慢的I/O系统的问题;
  • 当您在内存中加载文档时,存储的字段全部加载。这可能对GC有很大的压力,存储的字段可能会影响读者重新打开时间。

最终答案当然要看。如果原始数据已经存储在其他地方,最好从原始数据存储中检索它。

+1

Lucene不应被视为权威的数据源。数据应该存储在其他地方,所以在非存储文本字段上使用基于关键字的查询,然后查找来从单一真实来源获取实际数据。 – Glenn 2013-04-15 06:02:41

0

当从数据库向Lucene添加一行时,您可以判断它是否实际需要写入倒排索引。如果不是,则可以使用Index.NOT来避免将太多数据写入倒排索引。 同时,您可以通过键值来判断列将被查询的位置。如果不是,则不需要使用Store.YES来存储数据。