TermPositions如何在lucene中运行?

时间:2012-10-29 09:13:28

标签: lucene.net lucene

我有Lucene .Net索引(目前运行的版本为2.9.2,但我很快就会升级到新的3.0.3。)

对于搜索性能问题,我需要创建从DocId到Application Id的内存映射 - 所以我不需要从索引中获取存储的值(搜索结果可能返回数千个文档......)。由于索引迭代很多,我需要多次更新\重新创建这个映射 - 所以我需要快速完成。

我看到this great article尝试解决此问题,并通过使用Lucene的FieldCache机制检索结果或在唯一索引字段上使用TermPositions枚举来比较时间。正如作者所说,使用TermPositions创建映射确实比使用Lucene的FieldCache要快得多,但对我理解其中的原因非常重要。有人可以向我解释一下TermPositionsFieldCache在场景背后的作用吗?

2 个答案:

答案 0 :(得分:0)

Lucene中的TermPositions是一项高级功能。我只使用过一次(当你从2.9.x迁移到3.0.3 RC2时)。 TermPositions使用Tuple非常有效地存储,这使得快速访问作为数据结构并且它也很小,因此检索具有术语“位置”的有效载荷也很快。

我实际上最终通过了名为“Lucene in Action”的书中的样本......它适用于Java,但它基于Lucene 3.0.3,非常适合Lucene.NET 3.0.3:)< / p>

我提到这一点,因为FieldCache在这本书中有很深的涵盖,如果你想深入了解(深入理解它)......我会先看看那里。

BTW ......那篇文章是基于Lucene 2.2,2.3-> 2.9.x,当他们添加“近实时搜索”并使许多方法过时时,这是一个非常大的跳跃...... 3.0.3也改变了,所以他们的数字可能无法反映正在发生的事情。

答案 1 :(得分:0)

原因很简单。 Lucene将字段值存储为字符串。当您调用GetInts并且值不在缓存中时,它需要读取字符串,然后将它们解析为整数。

使用有效负载时,您会将int编码为一个字节数组,然后将其转换回int。这样,你只需要让Lucene读取给定位置的4个原始字节,然后转换回int。

字符串读取/解析操作在这里有很大的不同