Indexing 如何在GUI中获得Hibernate Lucene索引创建的统计信息?

Indexing 如何在GUI中获得Hibernate Lucene索引创建的统计信息?,indexing,orm,lucene,hibernate-search,Indexing,Orm,Lucene,Hibernate Search,我开发了一个管理面板,用于在我的应用程序处于维护模式时创建MassIndexer时显示Hibernate Lucene索引统计信息。我在文档中发现,我们可以使用SearchFactory.getStatistics()获取统计信息,但我没有获得任何统计信息,下面是我的代码片段 Session session = sessionFactory.openSession(); boolean flag=false; FullTextSession fullTextSes

我开发了一个管理面板,用于在我的应用程序处于维护模式时创建
MassIndexer
时显示Hibernate Lucene索引统计信息。我在文档中发现,我们可以使用
SearchFactory.getStatistics()
获取统计信息,但我没有获得任何统计信息,下面是我的代码片段

Session session = sessionFactory.openSession();
        boolean flag=false;
        FullTextSession fullTextSession = Search.getFullTextSession(session);
        SearchFactory searchFactory = Search.getFullTextSession(session).getSearchFactory();
fullTextSession
             .createIndexer(ABC.class)
             .typesToIndexInParallel( 2 )
             .batchSizeToLoadObjects( 25 )
             .cacheMode( CacheMode.IGNORE )
             .threadsToLoadObjects( 5 )
             .idFetchSize( 150 )
             .progressMonitor(new SimpleIndexingProgressMonitor()) //a MassIndexerProgressMonitor implementation
             .startAndWait();
            Statistics statistics2 = searchFactory.getStatistics();
            session.clear();

我在下面的链接中提到,我们可以为索引创建提供GUI[

对象收集有关正常使用Hibernate搜索的统计信息

要收集有关Mass Indexer进度的数据,您应该插入自己的
org.hibernate.search.batchindexing.MassIndexerProgressMonitor

MassIndexerProgressMonitor
是一个接口,因此您可以实现自己的接口,也可以扩展
SimpleIndexingProgressMonitor
并覆盖某些方法(如果愿意)

MassIndexerProgressMonitor monitor = new CustomIndexerProgressMonitor();
fullTextSession.createIndexer(ABC.class)
            .progressMonitor(monitor)
            .start();
// Now your custom index progress monitor will receive notifications about the progress
通过收集自定义
MassIndexerProgressMonitor
实现上的数据,您可以实现进度条或类似功能

  • 您已经知道它将索引哪些类型:您告诉他要索引的类型(在上面的示例中,类
    ABC
    的所有对象及其子类)
  • 方法
    MassIndexerProgressMonitor.addToTotalCount(long)
    将被多次调用(技术上是针对每个子类型),但所有调用都发生在流程的“开始”,因此您可以将其用作要索引的元素总数的估计值(“100%”)
  • 方法
    MassIndexerProgressMonitor.documentsBuilt(int)
    将让您了解正在取得的进展:这将被调用多次,您必须在实现中保留一个总计数器来跟踪总进度-从这里您可以估计您已经取得了多大的进展
  • 您可以将这些指标与一些时间跟踪结合起来,以估计完成所需的时间

请记住,当索引较小且适合ram时,索引速度会稍快一些,因此在进行过程中,索引速度往往会稍慢一些。如果您给出了乐观的估计,人们通常会感到恼火,然后再放慢速度,而如果您稍微高估了一些,然后实际上表现得稍微好一些,他们会感到高兴,因此您可能需要调整计算对于估计的时间,我有点悲观-多少将取决于您的典型索引大小和磁盘速度,所以请尝试一下。

感谢@Sanne的回复,它工作正常,但是,我们希望在管理GUI中显示整个索引日志,如1.哪些实体被索引?2.为特定实体索引了多少行?3.可以吗我们预先估计了创建整个实体的时间?因为我们希望向用户显示进度条,就像我们在上传文件时显示的那样。您可以通过
MassIndexerProgressMonitor
API获得所有信息。我已经修改了答案,以使其更加清晰。感谢@Sanne的回复。您的答案非常适合您进度条,但这里是“我们如何获取正在处理的实体”?因为
MassIndexerProgressMonitor.AddToToTotalCount(长)
不是一次给出所有实体的总计数,而是一个接一个地给出它们。当我的
MassIndexer
查询中有多个实体时,将进度条设置为100%对我来说有点困难。因此,我决定使用上述度量逐个实体显示进度条。看看这个MassIndexerMassIndexerProgressMonitor=new CustomIndexerProgressMonitor();fullTextSession.createIndexer(ABC.class,DEF.class,XYZ.class)。progressMonitor(monitor.start();@Sanne。在我的应用程序中,我为索引创建实现了一个管理面板。`fullTextSession.createIndexer(ABC.class,DEF.class,XYZ.class)`。我从这个
addtotalcount(long count)
中观察到,有时我得到的是3个实体的总数(ABC、DEF、XYZ),有时我得不到3个实体的总数(ABC、DEC、XYZ)相反,我得到的是任意一个实体的计数。因此,如果我再次重新启动索引创建,我得到的是3个实体的计数。为什么每次执行都会显示不同的行为。