Hibernate Search + Spring + JPA + 2 webapps - 正确的配置

时间:2013-03-18 14:45:16

标签: spring hibernate jpa lucene hibernate-search

我搜索的时间很长很难,但找不到明确的答案。

我在单个tomcat实例上运行了2个webapp:/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个项目,但如果我做了query = new MatchAllDocsQuery();,我只有15(最后一次导入的大小)

这真让我疯狂。

目前,我不得不关闭网站,删除索引,启动服务器,使用FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager()); fullTextEntityManager.createIndexer().startAndWait();重新索引

如果您需要更多信息,请告诉我

由于

2 个答案:

答案 0 :(得分:1)

如果仅通过服务器应用程序进行更改,并且您始终希望在同一台计算机上运行服务器 ROOT ,则无需主/从设置。但是,您应该确保在 ROOT 应用程序_hibernate.search.indexing_strategy = manual_上指定一个简单的文件系统设置。这种方式只有在 ROOT 应用程序上使用显式索引API时才会发生索引更新。

你开启了伐木吗?日志中有什么东西吗?我认为第一步是尝试以可靠的方式重现问题。如果你只是说它最初有效,但突然间它开始失败,就很难找到原因。您是否尝试过一些自动负载测试?

答案 1 :(得分:0)

一个想法 - 也许你应该切换到non-exclusive mode(参见exclusive_index_use