Java 在Lucene分类器中使用多个叶子
我正在尝试使用lucene中的KNearestNeighbour分类器。文档分类器在其构造函数中接受一个leafReader,用于训练分类器。 问题是,我用来训练分类器的索引有多个叶子。但是该类的构造函数只接受一个叶,并且我找不到将剩余的叶读取器添加到该类的进程。我可能错过了什么。有谁能帮我解决这个问题吗 以下是我当前使用的代码:Java 在Lucene分类器中使用多个叶子,java,lucene,document-classification,Java,Lucene,Document Classification,我正在尝试使用lucene中的KNearestNeighbour分类器。文档分类器在其构造函数中接受一个leafReader,用于训练分类器。 问题是,我用来训练分类器的索引有多个叶子。但是该类的构造函数只接受一个叶,并且我找不到将剩余的叶读取器添加到该类的进程。我可能错过了什么。有谁能帮我解决这个问题吗 以下是我当前使用的代码: FSDirectory index = FSDirectory.open(Paths.get(indexLoc)); IndexReader read
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");
叶子代表你索引的每一部分。在性能和资源使用方面,您应该迭代叶子,为每个片段运行分类,并累积结果
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之后)。此外,此类已弃用,并计划在Lucene 7.0中删除
第三个选项可能是运行
forceMerge(1)
,直到您只有一个段,并且可以使用单个叶进行此操作。但是,强制合并到单个段还有其他问题,可能不适用于您的用例。如果数据只写一次,然后仅用于读取,则可以使用forceMerge。如果您有定期更新,您将不得不使用第一个选项并自己聚合分类结果。我使用的是lucene 6.3。第一种方法对我来说不是一种选择,因为我必须同时训练分类器,聚合将不可能。“SlowCompositeReaderWrapper”似乎是目前可行的选择。谢谢