[英]Spring JPA + Hibernate Search : How update the Search Index(Lucene) only?
[英]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.xml
, hibernate.properties
或某些框架特定的文件,取決於您使用的內容)中引用它:
hibernate.search.model_mapping com.myCompany.MyAppSearchMappingFactory;
而且你應該准備好了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.