Hibernate Search:在应用程序之间共享索引

Hibernate Search: Share index between applications

我们正在研究使用 Hibernate/JPA 访问数据库的 JavaFX 解决方案。我们使用 Hibernate Search with Lucene 来搜索实体,效果很好,只要程序的一个实例是 运行。如果启动第二个实例,搜索仍然有效,但更新实体失败,因为第一个启动的应用程序保持对索引的写锁定。我们没有使用任何类型的 JavaEE 应用程序服务器,JavaFX 客户端直接通过 Hibernate 访问数据库。

在最终的生产环境中,将有一个 MS-SQL 服务器保存所有数据,服务器上的多个富客户端 运行 在虚拟机中或通过 VPN 连接到数据库服务器。我想启用所有客户端都可以添加和编辑实体并立即获取索引更新。我已经尝试使用 Infinispan 找到解决方案,但并没有真正掌握从哪里开始以及具体做什么。

任何人都可以告诉我如何完成这个吗?是否可以将索引直接保存在数据库中或启动某种服务,让客户端可以访问当前索引?

我认为这可能是您测试我们新的 Elasticsearch 集成的好用例。

我们今天发布了支持 Elasticsearch 的 5.6.0.Final。有关详细信息,请参阅 http://in.relation.to/2017/01/30/hibernate-search-5-6-0-Final-and-5-7-0-CR1/

请注意,如果您使用 ORM 5.2.x,则需要使用我们的 5.7.0.CR1(与支持 ORM 5 的 5.6.0.Final 基本相同。 2.x).

目前此支持仍处于试验阶段(试验意味着我们可能会在下一个版本中更改一些 API),但我认为对于您的用例绝对值得一试。

有多种选择。

  1. 就像 Guillaume Smet 建议的那样,将索引外部化到 Elasticsearch 集群。这可以扩大规模,但对于小型部署来说可能有点矫枉过正。
  2. 设置配置 属性 hibernate.search.default.exclusive_index_use=false 并将应用程序指向同一目录;他们将能够共享它,但他们必须 "take turns" 才能进行写入操作。另见 Table 3.7. List of indexing performance and behavior properties.
  3. 将索引存储在 Infinispan 目录中(在 memory-distributed 数据网格中)。分布方面可能有点矫枉过正,但它能够将存储卸载到关系数据库。参见 Infinispan Lucene Directory and JDBC Cache Store

既然你提到客户端 运行 通过 VPN 连接,我不建议 运行 Infinispan 处于集群模式,因为它意味着 high-performance(本地)链接,但你可以仍然在 "local mode" 中使用它,让每个人通过 JDBC 缓存存储读取更新的索引。然而,这种解决方案只有在写入不是很频繁的情况下才会有效,因为每个客户端都需要在每次索引更新时下载大块数据。 第二种解决方案需要每个客户端安装一个共享文件系统,这同样需要下载和缓存。