我们希望自己处理我们的Hibernate搜索实体之一的索引。是否有可能在Hibernate Search 6中禁用特定实体的自动索引?类似于较旧的Hibernate搜索全局设置:hibernate.earch.indexing_Strategy=MANUAL我已经搜索了文档,但没有看到这一点被提及。
mbjcgjjk1#
hibernate.search.indexing_strategy = manual适用于所有实体类型,而不适用于特定实体类型。你正在寻找的功能已经被提交为HSEARCH-168,目前计划在Hibernate Search 6.2中使用。与此同时,我认为你能做的最好的事情就是依靠黑客。它不会像我们设想的HSEARCH-168那样高效,但这是一个开始:
hibernate.search.indexing_strategy = manual
public class ManualIndexingRoutingBinder implements RoutingBinder { private static volatile boolean indexingEnabled = false; public static synchronized void withIndexingEnabled(Runnable runnable) { indexingEnabled = true; try { runnable.run(); } finally { indexingEnabled = false; } } @Override public void bind(RoutingBindingContext context) { context.dependencies() .useRootOnly(); context.bridge( Book.class, new Bridge() ); } public static class Bridge implements RoutingBridge<Book> { @Override public void route(DocumentRoutes routes, Object entityIdentifier, Book indexedEntity, RoutingBridgeRouteContext context) { if ( indexingEnabled ) { routes.addRoute(); } else { routes.notIndexed(); } } @Override public void previousRoutes(DocumentRoutes routes, Object entityIdentifier, Book indexedEntity, RoutingBridgeRouteContext context) { if ( indexingEnabled ) { // So that Hibernate Search will correctly delete entities if necessary. // Only useful if you use SearchIndexingPlan for manual indexing, // as the MassIndexer never deletes documents. routes.addRoute(); } else { routes.notIndexed(); } } } }
@Entity @Indexed(routingBinder = @RoutingBinderRef(type = ManualIndexingRoutingBinder.class)) public class Book { // ... }
ManualIndexingRoutingBinder.withIndexingEnabled(() -> { Search.mapping(entityManagerFactory).scope(Book.class) .massIndexer() .startAndWait(); });
我没有准确地测试这一点,所以请报告,但原则上这应该是可行的。
1条答案
按热度按时间mbjcgjjk1#
hibernate.search.indexing_strategy = manual
适用于所有实体类型,而不适用于特定实体类型。你正在寻找的功能已经被提交为HSEARCH-168,目前计划在Hibernate Search 6.2中使用。
与此同时,我认为你能做的最好的事情就是依靠黑客。它不会像我们设想的HSEARCH-168那样高效,但这是一个开始:
我没有准确地测试这一点,所以请报告,但原则上这应该是可行的。