我搜索的时间很长很难,但找不到明确的答案。
我在单个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();
重新索引
如果您需要更多信息,请告诉我
由于
答案 0 :(得分:1)
如果仅通过服务器应用程序进行更改,并且您始终希望在同一台计算机上运行服务器和 ROOT ,则无需主/从设置。但是,您应该确保在 ROOT 应用程序_hibernate.search.indexing_strategy = manual_上指定一个简单的文件系统设置。这种方式只有在 ROOT 应用程序上使用显式索引API时才会发生索引更新。
你开启了伐木吗?日志中有什么东西吗?我认为第一步是尝试以可靠的方式重现问题。如果你只是说它最初有效,但突然间它开始失败,就很难找到原因。您是否尝试过一些自动负载测试?答案 1 :(得分:0)
一个想法 - 也许你应该切换到non-exclusive mode(参见exclusive_index_use
)