私は長く懸命に検索しましたが、決定的な答えを見つけることができません。
tomcatの単一インスタンスで2つのWebアプリケーションを実行しています:/server
および/ROOT
エンティティの1つ、つまり、に対してHibernateSearchを構成しましProducts
た。
これらのエンティティは/server
、Webサイトのフロントエンドユーザーによって編集/追加および検索されます/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>
本質的に同一です。
これが、AspectJITDを介したエンティティの構成方法です。
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>
これは、何らかの理由でインデックス自体が「リセット」され、最後の製品インポートの一部であったアイテムのみが含まれていた今日まで、機能しているように見えました。つまり、私のDBには10000個のアイテムがありますが、を実行した場合、query = new MatchAllDocsQuery();
15個(最後のインポートのサイズ)しか取得できませんでした。
これは本当に私を夢中にさせています。
現時点では、Webサイトを停止し、インデックスを削除し、サーバーを起動し、を使用してインデックスを再作成する必要があります。FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager());
fullTextEntityManager.createIndexer().startAndWait();
さらに情報が必要な場合はお知らせください
ありがとう