Spring 休眠搜索+;弹簧&x2B;JPA&x2B;2个Web应用程序-正确配置
我已经找了很长时间,找不到确切的答案 我在tomcat的一个实例上运行了两个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
/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。