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
- 方法
将被多次调用(技术上是针对每个子类型),但所有调用都发生在流程的“开始”,因此您可以将其用作要索引的元素总数的估计值(“100%”)MassIndexerProgressMonitor.addToTotalCount(long)
- 方法
将让您了解正在取得的进展:这将被调用多次,您必须在实现中保留一个总计数器来跟踪总进度-从这里您可以估计您已经取得了多大的进展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个实体的计数。为什么每次执行都会显示不同的行为。