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.xml
、hibernate.properties
或某些 framework-specific 文件中引用它,具体取决于您使用的是什么):
hibernate.search.model_mapping com.myCompany.MyAppSearchMappingFactory;
你应该一切就绪。
我有两个应用程序使用相同的 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.xml
、hibernate.properties
或某些 framework-specific 文件中引用它,具体取决于您使用的是什么):
hibernate.search.model_mapping com.myCompany.MyAppSearchMappingFactory;
你应该一切就绪。