【问题标题】:Asynchronously build Hibernate Search index to ensure no downtime.异步构建 Hibernate Search 索引以确保不停机。
【发布时间】:2019-01-09 12:30:17
【问题描述】:

我们正在使用 Hibernate Search(Lucene 引擎)对我们存储在 SQL Server 数据库中并由用 Java 8 编写的搜索服务使用的一些数据启用文本模糊搜索。搜索的数据源是经过适度编辑的表/更新频率。我们需要的是,对于重建索引时所做的任何更改,我们希望确保搜索功能仍在运行且可访问,而不是被正在构建的索引进程锁定。

简而言之,如何在构建新索引时临时使用现有索引并在完成时替换它。

【问题讨论】:

  • 让我们问一个最重要的问题:为什么需要重建索引?是否已损坏?你更新你的映射了吗?或者您可能出于某种原因不想或无法启用automatic indexing?根据这一点,有些策略有意义,有些则没有。
  • @YoannRodière 我们的系统是按照多个服务使用相同数据库表的方式构建的。对所述表进行写操作的服务和使用休眠搜索进行搜索操作的服务彼此完全隔离。所以 Hibernate 建立的索引对于搜索服务来说是陈旧的,因此需要重建,因为我们发现添加到表中的新数据不会被我们的搜索服务返回。

标签: java hibernate lucene microservices hibernate-search


【解决方案1】:

不是您的问题的答案,但这无论如何都可以帮助您:根据我在您的 cmets 中的理解,您实际上并不需要完全重建索​​引,您只需要从不同的位置获取更新事件而不是执行搜索查询的应用程序。

如果您的“更新”应用程序使用 Hibernate ORM,您可以在不完全重建索​​引的情况下解决该问题:在“更新”应用程序中自动和增量地构建索引(在 "automatic indexing" mode 中使用 Hibernate Search 而无需进行任何查询) ,并确保索引可供“搜索”应用程序使用。

后者可以实现:

  • 使用实验性的Elasticsearch integration 并将两个应用程序连接到同一个集群:一个会更新它,另一个会使用它来搜索。
  • 或通过使用 Lucene 与 filesystem-master/filesystem-slave directory providers 的集成,这将允许您定期(且无需停机)将索引从“更新”应用程序(主)复制到“搜索”应用程序(从属)。请注意,如果多个应用程序更新索引,您将需要使用JMS or JGroups backend 将所有索引更新重定向到主节点并避免冲突。请注意,配置 JMS 或 JGroups 并不明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多