在 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化结果。
我正在尝试在 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化结果。