Я долго и упорно ищу, и не могу найти окончательного ответа.
У меня есть 2 веб-приложения, работающих на одном экземпляре tomcat: /server
и /ROOT
Я настроил Hibernate Search для одного из моих объектов, т.е. Products
.
Эти объекты редактируются/добавляются /server
и ищутся внешними пользователями на веб-сайте /ROOT
.
во время обычных операций все работает как надо, редактирование сущностей на сервере приведет к тому, что эти изменения отразятся при выполнении поиска на внешнем интерфейсе.
однако по прошествии неопределенного времени или последовательности событий индекс больше не обновляется.
вот конфигурация для /server
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="jpaDataSource" />
<property name="packagesToScan" value="com.foo" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaPropertyMap" ref="jpaPropertyMap" />
</bean>
<util:map id="jpaPropertyMap">
<entry key="hibernate.search.default.directory_provider" value="filesystem" />
<entry key="hibernate.search.default.indexBase" value="${lucene.index.folder}" />
</util:map>
а вот конфиг для /ROOT
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.foo" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaPropertyMap" ref="jpaPropertyMap" />
</bean>
<util:map id="jpaPropertyMap">
<entry key="hibernate.search.default.directory_provider" value="filesystem" />
<entry key="hibernate.search.default.indexBase" value="${lucene.index.folder}" />
</util:map>
По сути идентичны.
и вот как настроен мой Entity через AspectJ ITD
privileged aspect Product_Search {
declare @type: Product: @Indexed;
declare @method :public Long Product.getId() : @DocumentId;
declare @method :public String Product.getTitle() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getSubTitle() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getAlternativeTitle() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getIdentifier() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getPrimaryCreators() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getSecondaryCreators() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getSubjectArea() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
declare @method :public String Product.getPublisher() : @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO);
declare @method :public String Product.getTags() : @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO);
При дальнейшем поиске я обнаружил главный/подчиненный DirectoryProvider
/server
<util:map id="jpaPropertyMap">
<entry key="hibernate.search.default.directory_provider" value="filesystem-master" />
<entry key="hibernate.search.default.indexBase" value="${lucene.index.folder}/primary" />
<entry key="hibernate.search.default.sourceBase" value="${lucene.index.folder}/master" />
<entry key="hibernate.search.default.refresh" value="120" />
</util:map>
/ROOT
<util:map id="jpaPropertyMap">
<entry key="hibernate.search.default.directory_provider" value="filesystem-slave" />
<entry key="hibernate.search.default.sourceBase" value="${lucene.index.folder}/master" />
<entry key="hibernate.search.default.indexBase" value="${lucene.index.folder}/slave" />
<entry key="hibernate.search.default.refresh" value="300" />
</util:map>
Это, казалось, работало до тех пор, пока ранее сегодня, когда по какой-то причине мой индекс не «сбросил» себя и содержал только элементы, которые были частью последнего импорта продукта. Я имею в виду, что в моей БД 10000 элементов, но если я сделал query = new MatchAllDocsQuery();
, я получил только 15 (размер последнего импорта)
Это действительно сводит меня с ума.
На данный момент мне приходится сносить сайты, удалять индекс, запускать сервер, переиндексировать с помощью FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager());
fullTextEntityManager.createIndexer().startAndWait();
Дайте мне знать, если вам нужна дополнительная информация
Спасибо