我们每 7 天在 Lucene 索引上运行一次完整的重新索引(即从头开始创建索引),每 2 小时左右运行一次增量索引。我们的索引有大约 700,000 个文档,完整索引大约需要 17 个小时(这不是问题)。
当我们做增量索引时,我们只索引在过去两个小时内发生变化的内容,所以它花费的时间要少得多——大约半小时。但是,我们注意到其中很多时间(可能是 10 分钟)都花在了运行 IndexWriter.optimize() 方法上。
LuceneFAQ提到:
IndexWriter 类支持压缩索引数据库并加快查询速度的 optimize() 方法。您可能希望在对文档集执行完整索引之后或在索引的增量更新之后使用此方法。如果您的增量更新频繁添加文档,您希望只偶尔执行一次优化以避免优化的额外开销。
...但这似乎没有对“经常”的含义给出任何定义。优化是 CPU 密集型和 IO 密集型的,所以如果我们可以侥幸逃脱,我们宁愿不这样做。在未优化的索引上运行查询的影响有多大(我在考虑特别是在完全重新索引后的查询性能方面,与在 20 个增量索引后相比,例如,50,000 个文档已更改)?我们应该在每个增量索引之后进行优化,还是性能损失不值得?