0

我进行了漫长而艰苦的搜索,但找不到明确的答案。

我有 2 个 webapps 在单个 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>

基本相同。

这是通过 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 个项目,但如果我做了 a query = new MatchAllDocsQuery();,我只有 15 个(上次导入的大小)

这真的让我发疯。

目前,我不得不关闭网站,删除索引,启动服务器,使用重新索引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

一个想法 - 也许您应该切换到非独占模式(请参阅exclusive_index_use

于 2013-03-18T15:59:05.957 回答