【问题标题】:Hibernate Search: how to configure index for JPA entity dynamically?Hibernate Search:如何动态配置 JPA 实体的索引?
【发布时间】:2019-11-27 02:54:15
【问题描述】:

我有两个应用程序使用相同的 Elasticsearch 实例作为搜索引擎。两个应用程序共享相同的代码库,并且只有很小的差异。

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

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

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

但是,它不起作用。

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

有没有办法在运行时将索引名称传递给@Indexed 注释? 如果没有,还有其他方法可以传递应该使用的索引吗?

【问题讨论】:

    标签: java elasticsearch lucene hibernate-search spring-el


    【解决方案1】:

    目前,唯一的解决方案是使用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 或一些特定于框架的文件,具体取决于您使用的内容):

    hibernate.search.model_mapping com.myCompany.MyAppSearchMappingFactory;
    

    你应该准备好了。

    【讨论】:

    • 谢谢!我试试看
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 2011-11-20
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多