我正在尝试使用Lucene 4.4对文本文档进行分类。我为此使用KNearestNeighbour类(为方便起见,将其称为KNN)。我已经为所有文档建立了索引,但是我仍然坚持使用KNN类的train方法,该方法将AtomicReader作为参数(以及另外三个参数)。我将IndexReader(具有/不具有类型转换为AtomicReader)作为参数传递,但是给出了错误。 AtomicReader是IndexReader的子类。也许这就是问题所在。

但是我的查询是如何创建AtomicReader对象并将其传递给train方法。在我看来,在索引上创建AtomicReader的方法与创建IndexReader的方法不同。(Atomic reader是一个抽象类,因此我们可能必须使用其子类的对象)。

以下是我的代码段。 {indexLoc}是我创建索引的目录路径。 {knn}是KNearestNeighbour类的对象,该类是我的类的数据成员。

public void startClassification() {

    try {
            StandardAnalyzer analyzer1 = new StandardAnalyzer(Version.LUCENE_44);
            FSDirectory index = FSDirectory.open(new File(indexLoc));

            /*(???how to create an appropriate AtomicReader object)*/
            IndexReader reader = DirectoryReader.open(index);

            knn = new KNearestNeighborClassifier(k);
            knn.train(reader, "content", "category", analyzer1);
            classifyTestData();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

最佳答案

您可以通过遍历AtomicReaderleaves来获得IndexReader

for (AtomicReaderContext context : reader.leaves()) {
    final AtomicReader atomicReader = context.reader();
    knn.train(atomicReader, "content", "category", analyzer1);
}


DirectoryReaderIndexReader,但是具有一个或多个子阅读器-对于索引的每个段,-AtomicReaderIndexReader,没有任何子阅读器。因此,AtomicReader仅从一个段中查看文档,并且包含从context.docBasecontext.docBase + reader.maxDoc()的“全局” docId。

09-26 02:14