比方说,我有 一个 Lucene 索引,正在由 两个应用程序 使用。 为了简单起见,我将它们称为 “ReadApp” 和 “WriteApp”。 只有 WriteApp 可以将更改写入 Lucene-Index。
我的问题是,当两个应用程序都运行时,ReadApp 仅在重新启动后才能看到 WriteApp 对索引所做的更改。
有没有办法配置 ReadApp 在每次读取之前重新加载索引?
我们不要考虑这种努力的表现:)
我正在使用 Lucene 后端 (https://hibernate.org/search/releases/7.0/)
ReadApp的配置:
spring:
jpa:
properties:
hibernate:
search:
indexing:
plan.synchronization.strategy: sync
listeners.enabled: true
backend:
directory.locking.strategy: none
首先,这很危险,因为 Hibernate Search 没有只读模式。任何意外写入都可能损坏您的索引。 您应该考虑与 Hibernate 团队合作添加此类只读模式。 我想最近有人问过这个问题,但我无法参与对话……无论如何,你并不是唯一一个想要这样的功能的人。
如果您非常确定您的第二个应用程序不会写入索引...
有没有办法配置 ReadApp 在每次读取之前重新加载索引?
您所追求的是刷新。每次搜索之前刷新实际上是 Hibernate Search 默认执行的操作...只不过它假设它是唯一写入索引的,如果它没有写入索引,它只是跳过刷新。
(现在 Hibernate Search 中的只读模式会派上用场:Hibernate Search 可以推断出如果它没有写入,其他人正在写入,因此应该禁用此优化)
解决该限制的一种方法是使用“调试”IO 策略:
hibernate.search.backend.io.strategy=debug
我不会谈论性能,因为你不想,但是......我们应该谈论性能:)不要在你的写入节点上使用该策略,否则你会后悔的。