Hibernate Search 6.x - 如何将 Lucene 索引目录设置为只读

问题描述 投票:0回答:1

我有一个要求,即在构建期间生成 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 镜像,我需要以下任一才能使我的解决方案正常工作

  1. 如何让lucene后端使用只读索引目录

  2. 创建 docker 镜像时如何在 JIB 中设置容器文件夹权限。

autocomplete lucene hibernate-search
1个回答
0
投票

如何让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 也可以实现这一点,而且您的用例似乎可以证明这一点。

© www.soinside.com 2019 - 2024. All rights reserved.