2014-12-30 2 views
2

Мое требование Для каждого индекса для каждого арендатора у меня уже есть спящий режим, настроенный как MultiTenant, мне нужно индексировать базу данных для каждого арендатора на разные индексы. Я видел динамическую стратегию. Но требование динамическое. он может иметь n количество осколков без предварительной информации о существовании каждого арендатора. Даже My Indexer должен работать таким образом. Всякий раз, когда он находит запрос на спящий режим, получая индекс, он должен сначала проиндексировать этого арендатора, а затем выполнить поиск по нему.Hibernate Search with MultiTenancy

Как я могу это сделать .. ??

Может ли кто-нибудь дать мне пример. Пожалуйста, не давайте ссылки hibernate doc ... или даже ссылки Jboss doc для поиска в спящем режиме.

+0

Итак, вы говорите, что видели и читали документацию по динамическому очерчиванию Hibernate Search. Вы взглянули на ShardIdentifierProvider и пример, приведенный в документации. Динамический обмен позволяет вам создавать новые осколки «на лету», почему это не подходит для вашего использования? – Hardy

+0

Я прочитал. Он подходит для этого. Bt мое требование - я могу также динамически распределять каждый арендатор соответственно. –

+0

Hi Hardy, Я изучал поиск в спящем режиме, но проблема, с которой я сталкиваюсь в настоящее время, - это когда я пытаюсь использовать динамическую стратегию ошпаривания. по поиску поискового запроса. Но он не индексирует данные по коду, как следует за FullTextSession fullTextSession = Search.getFullTextSession (getCurrentSession()); fullTextSession.createIndexer(). StartAndWait(); –

ответ

0

Для индекса над конкретным арендатором, вы должны добавить свойство поиска спящего раздела EntityManager в контексте приложения, как последовать в качестве примера:

<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> 

Теперь вы должны использовать org.hibernate.Session для определить ваш арендатор, чтобы выполнить поиск по конкретному арендатору следующим образом:

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; 

Таким образом, каждый поиск будет использовать, специфические арендатора, которые вы предоставляете, но для меня, кажется, что у вас есть еще одна проблема, которая, как получить арендатора , в моем случае я использую URL для идентификации Если у вас есть арендатор, если вы все равно хотите, чтобы пользователь выбрал te tenant для использования, получите эту информацию в статической переменной, которая будет использоваться, когда это необходимо.