我正在尝试使用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();
}
}
答案 0 :(得分:2)
您可以通过迭代AtomicReader
的{{1}}获得leaves
:
IndexReader
虽然for (AtomicReaderContext context : reader.leaves()) {
final AtomicReader atomicReader = context.reader();
knn.train(atomicReader, "content", "category", analyzer1);
}
是DirectoryReader
,但有一个或多个子读者 - 对于索引的每个细分,IndexReader
是AtomicReader
,没有任何分读者。因此,IndexReader
仅查看来自一个细分的文档,并包含从AtomicReader
到context.docBase