在 Lucene 分类器中使用多个叶子

Using multiple Leaves in Lucene Classifiers

我正在尝试在 lucene 中使用 KNearestNeighbour classifier。文档 classifier 在其构造函数中接受一个 leafReader,用于训练 classifier。 问题是,我用来训练 classifier 的索引有多个叶子。但是 class 的构造函数只接受一片叶子,我找不到将剩余的 LeafReader 添加到 Class 的过程。我可能会错过一些东西。谁能帮我解决这个问题?

这是我目前使用的代码:

    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");

叶子代表您索引的每个部分。在性能和资源使用方面,您应该遍历叶子,运行 每个段的 class 化并累积您的结果。

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-core 或 lucene-misc(我认为自 Lucene 6.0 起)。此外,此 class 已弃用并计划在 Lucene 7.0 中删除。

第三个选项可能是 运行 forceMerge(1) 直到你只有一个片段并且你可以为此使用单叶。但是,强制合并到单个段还有其他问题,可能不适用于您的用例。如果您的数据是一次写入,然后仅用于读取,则可以使用 forceMerge。如果您有定期更新,则必须最终使用第一个选项并自行汇总 class化结果。