簡體   English   中英

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批注? 如果不是,是否還有另一種方法傳遞應該使用的索引?

目前,唯一的解決方案是使用程序化映射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;

而且你應該准備好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM