我试图在lucene中使用KNearestNeighbour分类器。文档分类器在其构造函数中接受leafReader,以训练分类器。问题是,我用来训练分类器的索引有多个叶子。但是类的构造函数只接受一页,我找不到一个进程将剩余的LeafReaders添加到类中。我可能错过了什么。有人能帮我解决这个问题吗?
下面是我目前使用的代码:
FSDirectory index = FSDirectory.open(Paths.get(indexLoc));
IndexReader reader = DirectoryReader.open(index);
LeafReaderContext leaf = leaves.get(0);
LeafReader atomicReader = leaf.reader();
KNearestNeighborDocumentClassifier knn = new KNearestNeighborDocumentClassifier(atomicReader, BM25, null, 10, 0, 0, "Topics", field2analyzer, "Text");发布于 2017-03-30 12:28:09
叶子代表你索引的每一段。在性能和资源使用方面,您应该遍历树叶,运行每个段的分类并累积结果。
for (LeafReaderContext context : indexReader.getContext().leaves()) {
LeafReader reader = context.reader();
// run for each leaf
}如果这是不可能的,您可以使用SlowCompositeReaderWrapper,顾名思义,它可能非常慢,因为它聚集了所有的叶子。
LeafReader singleLeaf = SlowCompositeReaderWrapper.wrap(indexReader);
// run classifier on singleLeaf这取决于您的Lucene版本,它位于Lucene或Lucene中(我认为从Lucene6.0开始)。另外,在Lucene7.0中,这个类被废弃,并计划删除。
第三种选择可能是运行forceMerge(1),直到只有一个段,并且可以使用单叶。但是,强制合并到单个段有其他问题,并且可能不适用于您的用例。如果您的数据被写入一次,然后只用于读取,则可以使用forceMerge。如果您有定期更新,您将不得不使用第一个选项并自己聚合分类结果。
https://stackoverflow.com/questions/43116813
复制相似问题