Lucene 多租户休眠搜索

Lucene 多租户休眠搜索,lucene,hibernate-search,multi-tenant,Lucene,Hibernate Search,Multi Tenant,我的要求是每个租户的每个索引,我已经将hibernate配置为多租户,我需要将每个租户的数据库索引到不同的索引。我注意到了动态硬化策略。。但需求是动态的。它可以有n个碎片,而不需要任何关于每个租户存在的预先信息。甚至我的索引器也应该以这样的方式工作。每当它找到获取索引的hibernate请求时,它应该首先为该租户编制索引,然后对其进行搜索 我怎么能做到 谁能给我举个例子吗。 请不要给hibernate文档链接。。。甚至是用于hibernate搜索的Jboss文档链接。要对特定租户进行索引,您应该

我的要求是每个租户的每个索引,我已经将hibernate配置为多租户,我需要将每个租户的数据库索引到不同的索引。我注意到了动态硬化策略。。但需求是动态的。它可以有n个碎片,而不需要任何关于每个租户存在的预先信息。甚至我的索引器也应该以这样的方式工作。每当它找到获取索引的hibernate请求时,它应该首先为该租户编制索引,然后对其进行搜索

我怎么能做到

谁能给我举个例子吗。
请不要给hibernate文档链接。。。甚至是用于hibernate搜索的Jboss文档链接。

要对特定租户进行索引,您应该在应用程序上下文中添加Entitymanager部分的hibernate搜索属性,如下所示:

<bean depends-on="dataSource" id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="generateDdl" value="true"></property>
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="packagesToScan" value="xxx.xxxx..xxx." />
    <property name="persistenceUnitName" value="xxxxxx" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
            <prop key="hibernate.search.default.directory_provider">filesystem</prop>
            <prop key="hibernate.search.default.indexBase">C:\xxxxx\indexes</prop>

        </props>
    </property>
</bean> 

这样,每次搜索都将使用您提供的特定租户,但对我来说,您似乎还有另一个问题,那就是如何获取租户,在我的情况下,我使用url来标识租户,如果您有用户选择使用的租户,在一个静态变量中获取这些信息,以便在必要时使用。

那么您的意思是您已经看到并阅读了Hibernate Search的动态切分文档。您看过ShardIdentifierProvider和文档中给出的示例了吗。动态共享允许您动态创建新的碎片,为什么它不适合您的用例?我读过了。这正合适。。我的要求是我也可以分别对每个租户进行动态切分。你好,Hardy,我研究了hibernate搜索,但我目前面临的问题是当我尝试使用动态切分策略时。启动搜索查询时。但它不按以下代码对数据进行索引:FullTextSession FullTextSession=Search.getFullTextSession(getCurrentSession());fullTextSession.createIndexer().startAndWait();我也有类似的问题。虽然我使用的Hibernate通过多租户多租户连接提供程序支持多租户,但MassIndexer对于具有动态碎片标识符的多租户似乎无法正常工作。我认为在这种情况下使用MassIndexer确实无法工作。正如您所说,您将无法通过ThreadLocal获取租户id。您可以尝试通过FullTextSession#index建立索引。看看这个例子
EntityManager manager = managerFactory.createEntityManager();

SessionImpl i = (SessionImpl) manager.getDelegate();
SessionFactory session = i.getSessionFactory();

Session s = session.withOptions().tenantIdentifier(xxxxx).openSession();

FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(s);
return fullTextSession;