【问题标题】:Lucene - Validate completeness of indexLucene - 验证索引的完整性
【发布时间】:2020-02-29 13:32:18
【问题描述】:

我们使用 Lucene 5.5.5 以允许对我们的数据库内容进行全文搜索。我们在数据库迁移后构建索引,并使用近实时索引管理器来保持索引是最新的。但是,有时可能会发生服务器在 indexmanager 提交仍保存在内存中的索引条目之前就被杀死的情况。

为了避免总是在服务器启动时重建索引,因为它很慢,我想知道是否可以检查索引是否完成。我知道有CheckIndex-Utility,但据我了解,它只能检查索引是否损坏,而不能检查是否完整。

另一个选项可能是一个索引器,它不会完全重建但会完成一个已经存在的索引。

解决此问题的最佳方法是什么?我的目标是在启动时尽可能少地浪费时间,并拥有一个完整的索引。

我想一个明显的解决方案是不再使用近实时索引管理器,但现在我不想考虑这个选项。

【问题讨论】:

    标签: java hibernate validation indexing lucene


    【解决方案1】:

    确实,近实时 indexmanager 将修改缓冲在内存中,据我所知,目前无法验证索引刷新的完整性。

    所以解决方案可能是:

    1. 切换到基于目录的索引管理器。 (缺点:与近实时索引管理器相比性能更差)

    2. 使用healthcheck 服务来检查您的应用程序的状态并更新数据库中的标志isServerForciblyClosed,如果它是true,则在下次启动时重建索引。如果计划关闭,应关闭此服务。

    3. 创建您自己的CustomIndexManager 实现扩展内置类或完全从头实现Indexmanager 接口

    【讨论】:

    • 我不确定您所说的“1)”是什么意思。索引管理器已经是基于目录的了吗?近实时和默认。还是我误解了这个词?
    • 是的,对不起,我就是这个意思。这就是我们在 NRT 之前使用的,由于性能影响我们停止使用它。显然,这将解决数据不一致问题:D 但是,我试图找到两全其美的方法。也许方法“2)”会更好。是否有可能找出 NRT 是否已经冲洗,如果可能的话甚至强制冲洗?
    • 不,据我所知这是不可能的。但是您可以创建自己的自定义实现hibernate.search.[default|<indexname>].indexmanager = my.corp.myapp.CustomIndexManager
    • NRT 与 IndexWriter 无关,而是与 IndexSearcher/Reader 的重新打开有关。
    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多