Оказывается, это было намного проще, чем я ожидал. Я просто использовал пример реализации на http://lucene.apache.org/java/2_9_0/api/core/org/apache/lucene/search/Collector.html и записал номера документов, переданные методу Collect()
, в List, выставив его как открытое свойство Docs
.
Затем я просто повторяю это свойство, передавая число обратно Searcher
, чтобы получить правильное Document
:
var searcher = new IndexSearcher( reader );
var collector = new IntegralCollector(); // my custom Collector
searcher.Search( query, collector );
var result = new Document[ collector.Docs.Count ];
for ( int i = 0; i < collector.Docs.Count; i++ )
result[ i ] = searcher.Doc( collector.Docs[ i ] );
searcher.Close(); // this is probably not needed
reader.Close();
Пока что в предварительных тестах все работает нормально.
Обновление: Вот код для IntegralCollector
:
internal class IntegralCollector: Lucene.Net.Search.Collector {
private int _docBase;
private List<int> _docs = new List<int>();
public List<int> Docs {
get { return _docs; }
}
public override bool AcceptsDocsOutOfOrder() {
return true;
}
public override void Collect( int doc ) {
_docs.Add( _docBase + doc );
}
public override void SetNextReader( Lucene.Net.Index.IndexReader reader, int docBase ) {
_docBase = docBase;
}
public override void SetScorer( Lucene.Net.Search.Scorer scorer ) {
}
}