Spring 休眠搜索+;弹簧&x2B;JPA&x2B;2个Web应用程序-正确配置

Spring 休眠搜索+;弹簧&x2B;JPA&x2B;2个Web应用程序-正确配置,spring,hibernate,jpa,lucene,hibernate-search,Spring,Hibernate,Jpa,Lucene,Hibernate Search,我已经找了很长时间,找不到确切的答案 我在tomcat的一个实例上运行了两个Web应用程序:/server和/ROOT <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property n

我已经找了很长时间,找不到确切的答案

我在tomcat的一个实例上运行了两个Web应用程序:
/server
/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>
    <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>
我已经为我的一个实体配置了Hibernate搜索,即
产品

这些实体在
/server
上编辑/添加,并由前端用户在网站
/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>
    <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>
在正常操作过程中,一切正常,在服务器上编辑实体将导致在前端执行搜索时反映的更改

但是,在一段不确定的时间或事件序列之后,索引将不再更新

以下是
/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>
    <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>
基本相同

下面是如何通过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);
进一步搜索后,我发现了主/从目录提供程序

/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>
    <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>
直到今天早些时候,由于某种原因,我的索引“重置”了,并且只包含上一次产品导入中的项目,这似乎一直有效。 我的意思是,我的数据库有10000个项目,但是如果我做了
query=new MatchAllDocsQuery(),我只得到了15(上次导入的大小)

这真的快把我逼疯了

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

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


谢谢一个主意-也许你应该切换到(请参阅“专用索引使用”

如果更改只是通过服务器应用程序进行的,并且你总是想在同一台机器上运行服务器和ROOT,那么就不需要主/从设置。不过,一个简单的文件系统设置应该可以做到,您需要确保在根应用程序上指定了_hibernate.search.indexing_strategy=manual。这样,只有在根应用程序上使用显式索引API时,才会发生索引更新


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

刚刚在生产中再次出现。在接下来的几天里,我们将把hibernate搜索日志级别改为DEBUG。如果在不久的将来有90%的可能性,我们也将在根应用程序中进行编辑,那么是否建议使用主/从设置?主/从应用程序是否必须与JMS一起运行?只要这两个应用程序在同一台机器上,您就可以使用文件系统目录。Lucene有自己的索引锁定机制,因此索引不会损坏(这就是另一个答案中的排他标志)。如果您有多台机器,则需要主/从。您也可以使用JGroups进行设置,但建议使用JMS。