0

我有 7 个实体类要使用 Hibernate Search 进行索引。在尝试了 MassIndexer 和 FlushToIndexes 之后,索引器进程通过最小的实体搅动,但最大的实体/表没有完成,即使 MassIndexerProgressMonitor 告诉索引已完成。该进程仅在达到分配的 100-200 MB 时挂起。我想确保索引过程正确结束。

问题:代码是否正确?应该调整休眠或数据库设置吗?


环境:64 位 Windows 7、JBoss、Struts2、Hibernate、Hibernate Search、Lucene、SQL Server。休眠搜索索引放置在文件系统中。


MassIndexer 代码示例:

  final Session session = HibernateSessionFactory.getSession();
  final FullTextSession fullTextSession = Search.getFullTextSession(session);
  MassIndexerProgressMonitor monitor = new IndexProgressMonitor("Kanalregister");
  fullTextSession.createIndexer()
                 .purgeAllOnStart(true)
                 .progressMonitor(monitor)
                 .batchSizeToLoadObjects(BATCH_SIZE)    // 250000
                 .startAndWait();

FlushToIndexes 代码示例:(来自 Hibernate ref. doc。)(似乎可以索引,但永远不会结束)

  final Session session = HibernateSessionFactory.getSession();
  final FullTextSession fullTextSession = Search.getFullTextSession(session);
  fullTextSession.setFlushMode(FlushMode.MANUAL);
  fullTextSession.setCacheMode(CacheMode.IGNORE);
  Transaction t1 = fullTextSession.beginTransaction();
  // Scrollable results will avoid loading too many objects in memory
  ScrollableResults results = fullTextSession.createCriteria(Land.class)
                                             .setFetchSize(BATCH_SIZE) // 250000
                                             .scroll(ScrollMode.FORWARD_ONLY);
  int index = 0;
  while (results.next()) {
     index++;
     fullTextSession.index(results.get(0)); // index each element
     if (index % BATCH_SIZE == 0) {
        fullTextSession.flushToIndexes(); // apply changes to indexes
        fullTextSession.clear(); // free memory since the queue is processed
     }
  }
  t1.commit();

使用 hibernate.cfg.xml 中的以下设置验证代码在模拟所有索引工作时结束:

  <property name="hibernate.search.default.worker.backend">blackhole</property>
4

1 回答 1

0

上面的代码经过验证且正确。

我的控制台没有结束的问题被认为与 Eclipse 有关,因为确实显示了 main() 末尾的打印输出。

有一些缺失的实体类(在我的模型中)没有正确报告。一旦我收到这些通知并将它们添加到我的模型中,MassIndexer 的索引过程就成功结束,Lucene 索引中每个目录中的 3+ 个文件证明了这一点。

于 2013-01-03T14:22:45.333 回答