我有一个要求,即在构建期间生成 lucene 索引,以使用 hibernate 搜索为自动完成 API 提供服务。该解决方案不需要动态索引生成或更新。这只应该为搜索查询提供已经生成和复制的索引。
据我所知,Hibernate search 6.x 及更高版本没有配置使 lucene 基本索引目录只读。如果有人知道如何做,请给我提供见解。
我正在使用 JPA,用于休眠搜索的 persistence.xml 配置如下
<property name="hibernate.search.backend.directory.type" value="local-filesystem"/>
<property name="hibernate.search.backend.directory.root" value="${LUCENE_INDEX_DIR}"/>
<property name="hibernate.search.mapping.build_missing_discovered_jandex_indexes" value="false"/>
<property name="hibernate.search.backend.lucene_version" value="8.11.2"/>
<property name="hibernate.search.schema_management.strategy" value="none"/>
<property name="hibernate.search.backend.directory.locking.strategy" value="none"/>
<property name="hibernate.search.backend.directory.locking.strategy" value="none"/>
我认为最后 2 个配置应该通过提供容器内的索引目录只读访问权限来使其工作。但它不起作用
我已经使用批量索引生成了索引,并在构建管道期间将整个索引目录发布到了 Maven。
SearchSession searchSession = Search.session(
HibernateUtil.getEntityManagerFactory().createEntityManager());
MassIndexer indexer = searchSession.massIndexer().purgeAllOnStart(true);
在部署过程中,我正在下载已发布的索引,并将其作为我的 docker 映像的一部分,以将其复制到容器文件系统位置,并且我正在使该位置可写以进行工作。这对我来说没问题。
现在我们采用 quarkus 和 JIB 来创建 docker 镜像,我需要以下任一才能使我的解决方案正常工作
如何让lucene后端使用只读索引目录
创建 docker 镜像时如何在 JIB 中设置容器文件夹权限。
如何让lucene后端使用只读索引目录
Hibernate Search 中没有只读模式 -- 还。
避免 Hibernate Search 写入索引,只是不要手动触发写入,并且(如果使用 ORM 集成)禁用自动触发器
hibernate.search.indexing.listeners.enabled = false
要启动 Hibernate Search 而不尝试出于锁定目的对索引目录进行任何写入,请禁用锁定:
hibernate.search.backend.directory.locking.strategy = none
警告:如果您的应用程序确实尝试写入索引,这显然是不安全的。
在 Quarkus 中,您需要依赖不受支持的属性——如果您认为这些属性有用,请随时在 GitHub 上打开问题以支持这些属性:
quarkus.hibernate-orm.unsupported-properties."hibernate.search.indexing.listeners.enabled" = false
quarkus.hibernate-orm.unsupported-properties."hibernate.search.backend.directory.locking.strategy" = none
话虽这么说,我很好奇您在 Quarkus 应用程序中使用 Lucene 后端 - 尚不支持。你怎么样?
创建 docker 镜像时如何在 JIB 中设置容器文件夹权限。
不知道,抱歉。我不确定这是否可能,但很高兴被证明是错误的。
我建议使用 JIB 创建映像,然后在构建管道中使用额外的步骤来使用 Dockerfile 启动应用程序?您将获取 JIB 映像,创建相关目录,填充索引,然后创建新映像。
或者,只使用 Dockerfile。 Quarkus 也可以实现这一点,而且您的用例似乎可以证明这一点。