Hibernate Search 在多租户 Spring 引导应用程序中初始化索引

Hibernate Search initialise index in multi-tenant Spring Boot application

我有一个使用 Hibernate 的 Spring 启动应用程序,我正在向它添加 Hibernate Search。该应用程序将模式分离的多租户与 Hibernate 结合使用,实现 MultiTenantConnectionProviderCurrentTenantIdentifierResolver

我想在应用程序启动时创建初始搜索索引(或重新索引),以便能够搜索现有数据。

这是进行索引的服务:

@Service
public class SearchService {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void initializeSearchIndex() {

        try {
            FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

但问题是我不知道在哪里调用这个服务。因为它基于 EntityManager 而不是 DataSource,所以它似乎与单个租户(数据库模式)相关联。有没有办法为整个数据库创建索引?如果是这样,在哪里调用它?

本质上,您需要为每个租户打开不同的会话(实体管理器)。您不能使用单个 cross-tenant 质量索引器,因为这违背了 multi-tenancy 的概念:严格分离对每个租户数据的访问。

我不知道使用 Spring 引导正确执行此操作的确切方法,但您的代码将如下所示:

@Service
public class SearchService {

    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;

    public void initializeSearchIndex() {
        SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
        for (String tenantId : getAllTenantIds()) {
            try (Session session = sessionFactory.withOptions().tenantIdentifier(tenantId).openSession()) {
                FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(session);
                fullTextEntityManager.createIndexer().startAndWait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    List<String> getAllTenantIds() {
         // return all tenant Ids
    }
}