使用Hibernate Search 6-如何防止特定实体的自动索引?

ep6jt1vc  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(137)

我们希望自己处理我们的Hibernate搜索实体之一的索引。
是否有可能在Hibernate Search 6中禁用特定实体的自动索引?类似于较旧的Hibernate搜索全局设置:hibernate.earch.indexing_Strategy=MANUAL
我已经搜索了文档,但没有看到这一点被提及。

mbjcgjjk

mbjcgjjk1#

hibernate.search.indexing_strategy = manual适用于所有实体类型,而不适用于特定实体类型。
你正在寻找的功能已经被提交为HSEARCH-168,目前计划在Hibernate Search 6.2中使用。
与此同时,我认为你能做的最好的事情就是依靠黑客。它不会像我们设想的HSEARCH-168那样高效,但这是一个开始:

  • 实现基于开关的RoutingBridge,它将完全禁用索引(在索引中添加和删除实体),或者正常运行,就像没有路由桥一样:
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();
});

我没有准确地测试这一点,所以请报告,但原则上这应该是可行的。

相关问题