AtomicReader和KNearestNeighbour train()方法

时间:2013-11-19 09:50:57

标签: java solr lucene

我正在尝试使用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();
    }
}

1 个答案:

答案 0 :(得分:2)

您可以通过迭代AtomicReader的{​​{1}}获得leaves

IndexReader

虽然for (AtomicReaderContext context : reader.leaves()) { final AtomicReader atomicReader = context.reader(); knn.train(atomicReader, "content", "category", analyzer1); } DirectoryReader,但有一个或多个子读者 - 对于索引的每个细分,IndexReaderAtomicReader,没有任何分读者。因此,IndexReader仅查看来自一个细分的文档,并包含从AtomicReadercontext.docBase

的“全局”文档