Optimization Lucene中的增量索引之后是否应该优化索引?

Optimization Lucene中的增量索引之后是否应该优化索引?,optimization,lucene,Optimization,Lucene,我们每7天对Lucene索引和增量索引运行一次完整的重新索引(即从头开始创建索引),大约每2小时运行一次。我们的索引大约有700000个文档,完整的索引大约需要17个小时(这不是问题) 当我们进行增量索引时,我们只索引在过去两个小时内发生变化的内容,因此所需时间要少得多——大约半个小时。但是,我们注意到,大部分时间(可能10分钟)都花在运行IndexWriter.optimize()方法上 报告提到: IndexWriter类支持一个optimize()方法,该方法压缩索引数据库并加快查询速度。

我们每7天对Lucene索引和增量索引运行一次完整的重新索引(即从头开始创建索引),大约每2小时运行一次。我们的索引大约有700000个文档,完整的索引大约需要17个小时(这不是问题)

当我们进行增量索引时,我们只索引在过去两个小时内发生变化的内容,因此所需时间要少得多——大约半个小时。但是,我们注意到,大部分时间(可能10分钟)都花在运行IndexWriter.optimize()方法上

报告提到:

IndexWriter类支持一个optimize()方法,该方法压缩索引数据库并加快查询速度。您可能希望在对文档集执行完整的索引后或在对索引进行增量更新后使用此方法。如果您的增量更新经常添加文档,您希望每隔一段时间只执行一次优化,以避免优化带来的额外开销


……但这似乎没有给“频繁”的含义下任何定义。优化是CPU密集型和IO密集型的,因此,如果我们能侥幸逃脱,我们宁愿不去做。在一个未优化的索引上运行查询的影响有多大(我特别考虑在完全重新索引之后的查询性能,而在20个增量索引之后,比如50000个文档发生了更改)?我们应该在每次增量索引后进行优化,还是性能损失不值得呢?

Mat,既然您似乎很清楚当前过程需要多长时间,我建议您删除
optimize()
,并测量影响

在这两个小时的窗口中,有许多文档会发生变化吗?如果只有一小部分(50000/700000约为7%)以增量方式重新编制索引,那么我认为您不会从
optimize()
中获得多少价值

一些想法:

  • 根本不要执行增量
    optimize()
    。根据我的经验,您并没有看到查询的巨大改进
  • 每天执行
    optimize()
    ,而不是每两小时执行一次
  • 在低音量时执行
    optimize()
    (这就是所说的)

并确保你进行了测量。如果没有它们,这些类型的更改可能是在黑暗中进行的。

一个
优化操作可以读取和写入整个索引,这就是为什么它如此IO密集的原因

优化操作背后的思想是将Lucene索引中的所有不同段重新组合为一个段,这可以大大减少查询时间,因为每次查询不必打开和搜索多个文件。如果您使用的是普通的Lucene索引文件结构(而不是组合结构),那么每次提交操作都会得到一个新的段;我想和你的re索引一样吧

我认为他有很好的建议,我会支持他所说的一切——由你拥有的数据驱动。实际上,我会更进一步,只在a)需要时和b)查询量较低时选择tmize

由于查询性能与索引中的段数密切相关,因此一个简单的
ls-1索引/段数*| count
可能是一个有用的指标,用于指示何时真正需要进行优化


或者,跟踪查询性能和数量,并在达到不可接受的低性能和可接受的低容量时启动优化,这将是一个更好的解决方案。

在中,如果您的索引不断更新,Otis Gospodnetic建议不要使用优化。这是从2007年开始的,但是调用
optimize()
本质上是一个IO繁重的操作。你可以考虑采用更循序渐进的方法;a

这些变化都是在没有它们的情况下在黑暗中拍摄的。干杯,我想知道在我潜入并开始搅乱生产系统之前,人们是否有过这样的经历:)马特:是的,我知道你在寻找具体的建议,我有点笼统。根据我的经验(我已经使用Lucene多年),如果没有optimize(),您会很好。我已经从我们的系统上删除了optimize(),因为它的开销太大了。@MattQuail,所以即使在完全重新运行之后,您也不会优化索引?