我正在尝试使用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();
}
}
最佳答案
您可以通过遍历AtomicReader
的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
到context.docBase + reader.maxDoc()
的“全局” docId。