0

私は長く懸命に検索しましたが、決定的な答えを見つけることができません。

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();

さらに情報が必要な場合はお知らせください

ありがとう

4

2 に答える 2

1

変更がサーバーアプリ経由でのみ行われ、サーバーROOTを常に同じマシンで実行したい場合は、マスター/スレーブの設定は必要ありません。単純なファイルシステムのセットアップで十分ですが、ROOTアプリで _hibernate.search.indexing_strategy = manual_ が指定されていることを確認する必要があります。この方法では、 ROOTアプリで明示的なインデックス作成 API が使用されている場合にのみ、インデックスの更新が発生します。

ロギングをオンにしましたか?ログに何かありますか。最初のステップは、信頼できる方法で問題を再現しようとすることだと思います。最初はうまくいったと言って、すぐにうまくいかなくなってしまうと、原因を見つけるのが難しくなります。自動化された負荷テストをいくつか試しましたか?

于 2013-03-19T10:18:50.017 に答える
0

1 つのアイデア -非独占モードに切り替える必要があるかもしれません( を参照exclusive_index_use) 。

于 2013-03-18T15:59:05.957 に答える