我想在索引过程中实时获取Lucene索引的信息。因此,我在代码中使用CheckIndex类,如下所示:
CheckIndex.Status indexStatus = checkIndex.checkIndex();
Iterator<CheckIndex.Status.SegmentInfoStatus> iterator = indexStatus.segmentInfos.iterator();
CheckIndex.Status.SegmentInfoStatus temp = null;
while(iterator.hasNext()) {
temp = iterator.next();
term_number += temp.termIndexStatus.termCount;
index_MB_size += temp.sizeMB;
}
首先,索引文件夹为空。每次Lucene完成对文本文件的索引时,我都会输出term_number
和index_MB_size
(每个大约10MB,全部大约600MB)。所以我得到了大约60双的结果。但我很遗憾地发现60对中的2个变量总是0。只有当索引段完成时,统计信息才会显示非零的结果。
我猜这是由于CheckIndex类只能在索引完成后才能正确工作。但是我还没有检查过。
如何实时获取信息?此外,CheckIndex过程非常耗时,是否有其他更好的方法来获取这两个方面的信息(索引大小和项数)?
我终于在Lucene in Action第二版找到了答案。
这是因为IndexReader
和CheckIndex
只能看到IndexWriter
调用commit()
方法后索引的变化。Commit与Flush非常不同,因为Flush只会将所有缓存的数据刷新到磁盘,而Commit
会先执行Flush,然后让IndexReader
看到所有的更改。