Hibernate Search:如何为 JPA 实体动态配置索引?

Hibernate Search: how to configure index for JPA entity dynamically?

我有两个应用程序使用相同的 Elasticsearch 实例作为搜索引擎。这两个应用程序共享相同的代码库,只有细微差别。

针对不同数据库的应用程序运行,因此,应使用不同的 ES 索引。

我尝试像这样使用 SpEL 参数化索引名称:

@Indexed(index="${es.index.users}")
public UserEntity {}

然而,它不起作用。

我尝试过的第二个选项是通过 hibernate.search.default.indexBase=<app_name> 为不同的应用程序设置不同的前缀。但是,它只适用于 Lucene 引擎,不适用于 ES。

有没有办法在 运行 时间将索引名称传递到 @Indexed 注释中? 如果没有,是否有另一种方法可以传递应该使用的索引?

目前,唯一的解决办法是使用 programmatic mapping API。这将允许您执行代码来设置索引名称。如果您需要从配置文件中检索索引名称,那将由您负责...

首先,从您的索引实体中删除 @Indexed 注释。

然后,实现映射工厂:

package com.myCompany;

// ... imports ...

public class MyAppSearchMappingFactory {
    @Factory
    public SearchMapping getSearchMapping() {
        SearchMapping mapping = new SearchMapping();
        for ( Map.Entry<Class<?>, String> entry : getIndexNames() ) {
             mapping.entity( entry.getKey() ).indexed().indexName( entry.getValue() );
        }
        return mapping;
    }

    private Map<Class<?>, String> getIndexNames() {
         // Fetch the index names somehow. Maybe just use a different implementation of this class in each application?
    }
}

然后在 Hibernate ORM 属性(persistence.xmlhibernate.properties 或某些 framework-specific 文件中引用它,具体取决于您使用的是什么):

hibernate.search.model_mapping com.myCompany.MyAppSearchMappingFactory;

你应该一切就绪。