使用Hibernate Search质量索引器时遇到问题。 Mass Indexer产生以下错误:
3815 06 Mar 2015 18:16:06 LogErrorHandler ERROR 3819571 kb HSEARCH000058: Exception occurred org.apache.lucene.index.IndexNotFoundException: no segments* file found in MMapDirectory@/srv/www/test.e-galexis.com/devlSearchIndex/com.galexis.search.importer.search.searchdb.model.Product lockFactory=NativeFSLockFactory@/srv/www/test.e-galexis.com/devlSearchIndex/com.galexis.search.importer.search.searchdb.model.Product: files: [write.lock]
Primary Failure:
Entity com.galexis.search.importer.search.searchdb.model.Product Id null Work Type org.hibernate.search.backend.PurgeAllLuceneWork
org.apache.lucene.index.IndexNotFoundException: no segments* file found in MMapDirectory@/srv/www/test.e-galexis.com/devlSearchIndex/com.galexis.search.importer.search.searchdb.model.Product lockFactory=NativeFSLockFactory@/srv/www/test.e-galexis.com/devlSearchIndex/com.galexis.search.importer.search.searchdb.model.Product: files: [write.lock]
at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:864)
我检查过Java进程是否有权根据需要创建文件夹和文件。实际上创建了文件夹和write.lock。在Java进程启动之前,index.base文件夹为空。
这些是我的版本:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>5.0.1.Final</version>
</dependency>
我使用JDK 1.8并将Hibernate Search与Spring 3.2.1.RELEASE一起集成。
无论我在质量索引器API上执行的自定义,都会发生错误。目前我从发布的代码调用reindex()方法,该方法使用最简单的质量索引器API形式:
@PersistenceContext
private EntityManager entityManager;
@Transactional
@Override
public void reindex() throws InterruptedException {
logger.debug("Re-indexing started");
fullTextEntityManager().createIndexer().startAndWait();
logger.info("Re-indexing finished");
}
protected FullTextEntityManager fullTextEntityManager() {
return Search.getFullTextEntityManager(entityManager);
}
注入的EntityManager
是org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler
的实例,reindex()
方法是从独立进程调用的(即,不涉及Spring / JPA JTA设置)。
我们实际上正在从Hibernate Search 3.4.2.Final迁移,我们也只在Linux机器上遇到质量索引器问题,但是我们能够通过将不同的质量索引器线程数量自定义为一个来解决这些问题,例如
fullTextEntityManager().createIndexer(Product.class).threadsForIndexWriter(1).threadsForSubsequentFetching(1).threadsToLoadObjects(1).startAndWait();
然而,并非所有这些方法仍然可用,我相信缺少一个,另一个不推荐使用。但我也相信这与旧版本有不同的问题,可能与当前版本无关。无论如何,正如我所提到的,我尝试使用可用的方法将线程数量自定义为1,但无济于事。
答案 0 :(得分:1)
事实证明这是自制问题。我有代码在重新索引开始之前从 index.base 目录中删除了所有文件(...是的,我知道这是 purgeAllOnStartup()的内容... )。此代码包含在spring bean中,并在程序启动时由 @PostConstruct 回调触发。事实证明,Hibernate Search / Lucene在启动时开始读取 index.base 目录内容(异步,可能是吗?)( EntityManagerFactory 得到构造我记得)这与当前正在删除文件的代码相冲突。
删除删除index.base内容的代码很好地修复了它。