合并索引Lucene.NET不会产生与直接写入索引相同的结果

合并索引Lucene.NET不会产生与直接写入索引相同的结果,.net,lucene.net,.net,Lucene.net,我一直在尝试一些异步初始化Lucene索引的方法 其中一个方法是将我们的数据以较小的批量索引到单独的索引中,然后将这些索引合并到一个较大的索引中 问题是,当任务完全完成时,我们的索引似乎不会产生相同的结果 现在许多特定的查询将产生相同数量的结果,例如。 contentType:通知 全文档选择器也会产生相同的结果。(:) 但是如果我做一个通配符搜索,例如“c*”,从零碎的索引构建的索引,然后合并,结果为0,但是一次大的搜索可以产生数十万个结果(这是公平的,因为c*是一个相当广泛的搜索) 在合并索

我一直在尝试一些异步初始化Lucene索引的方法

其中一个方法是将我们的数据以较小的批量索引到单独的索引中,然后将这些索引合并到一个较大的索引中

问题是,当任务完全完成时,我们的索引似乎不会产生相同的结果

现在许多特定的查询将产生相同数量的结果,例如。 contentType:通知

全文档选择器也会产生相同的结果。(:)

但是如果我做一个通配符搜索,例如“c*”,从零碎的索引构建的索引,然后合并,结果为0,但是一次大的搜索可以产生数十万个结果(这是公平的,因为c*是一个相当广泛的搜索)


在合并索引上有什么需要做的事情吗?或者在处理它们时有什么不同吗?。。。我尝试在它们上运行优化,但没有成功。

不知道任何细节。。。我得说你在这个坚果上用的锤子太大了:)

我使用过批量创建的索引(1亿份文档)和增量索引(每天有超过10万份文档更新)。这两种方法都只是在一个索引目录上使用了一个IndexWriter

诀窍是适当地调整IW合并策略和/或通过偶尔更新IndexReader来调整搜索器的“延迟”。这本质上是将IR“缓存”一段时间,以稍微过时为代价提高搜索速度。根据预期调整时段


如果这仍然是一个问题,我可以在不知道任何细节的情况下对方法进行扩展。。。我得说你在这个坚果上用的锤子太大了:)

我使用过批量创建的索引(1亿份文档)和增量索引(每天有超过10万份文档更新)。这两种方法都只是在一个索引目录上使用了一个IndexWriter

诀窍是适当地调整IW合并策略和/或通过偶尔更新IndexReader来调整搜索器的“延迟”。这本质上是将IR“缓存”一段时间,以稍微过时为代价提高搜索速度。根据预期调整时段


如果这仍然是一个问题,我可以对方法进行扩展

我想这一切都取决于文档的复杂性,如果您的文档非常简单,字段很少,那么它可能与非常复杂的文档非常不同。我所知道的是,索引我们所有的文档需要1个多小时。我们已经意识到这里存在一个存储瓶颈,因为在250K IOPS-2GB/s的存储上,同样的设置可以在7分钟内完成。因此,这可能无助于在内存中构建索引并将它们合并到磁盘中,但只有通过测试才能真正了解。如果不起作用,测试性能是毫无意义的。如果您是“批量”创建索引而不是连续更新,则可以在IndexWriter上使用SetRAMBufferSizeMB来获得较大的值。这将在刷新到磁盘之前缓冲内存中的文档。其副作用是,细分市场的规模要大得多,合并发生的频率要低得多。随着磁盘IO数量的大幅减少,我看到了几个数量级的改进。设置RAM缓冲区实际上只在达到刷新之前有所帮助。事实证明,虽然是SAN导致了我们的大多数问题,但索引约25万个文档(约7.5亿个字段,估计每个文档的平均字段数约为3000个)仍然需要10分钟左右的时间。。。虽然从理论角度来看,最初的问题仍然让我感兴趣,为什么合并方法似乎会产生不同的结果,但是我无法将问题复制到更简单和原始的实现中,因此最初的想法是它必须在我们的包装中)这两种方法之间应该没有区别。在内部,索引始终是段的集合。Optimize仅折叠段并删除已删除的文档。应该没有优化的必要。刷新以确保将缓冲区(内存中的段)持久化到存储器。打开一个新的IR,你应该很好。无论是批量索引还是长期索引,最终都会得到相同的结果。定义更大的内存缓冲区意味着批量插入时磁盘IO更少。IR实际上是索引在某个时间点的快照。你是在质疑一个“过时的”错误吗?目前原因还不清楚,我想说的是,很明显,我们在Lucene之上构建的框架存在错误,这表明如果我直接对Lucene进行简单得多的测试并合并索引,我无法重现错误。状态IR可能是一个原因,但由于:产生相同的结果,我们不做任何更新,我认为情况并非如此。无论如何,我将等待进一步挖掘,因为我们也在考虑升级到4.8版本,该版本最近进入了beta版,所以现在暂缓。我想这一切都取决于文档的复杂性,如果您有相当简单的文档,但字段很少,那么它可能与非常复杂的文档非常不同。我所知道的是,索引我们所有的文档需要1个多小时。我们已经意识到这里存在一个存储瓶颈,因为在250K IOPS-2GB/s的存储上,同样的设置可以在7分钟内完成。因此,这可能无助于在内存中构建索引并将它们合并到磁盘中,但只有通过测试才能真正了解。如果不起作用,测试性能是毫无意义的。如果您是“批量”创建索引而不是连续更新,则可以在IndexWriter上使用SetRAMBufferSizeMB来获得较大的值。这将在刷新到磁盘之前缓冲内存中的文档。其副作用是,细分市场的规模要大得多,合并发生的频率要低得多。我已经看到了数量级的改进,因为