Turns out it was a lot easier than I expected. I just used the sample implementation in http://lucene.apache.org/java/2_9_0/api/core/org/apache/lucene/search/Collector.html and wrote down the document numbers passed to the Collect() method in the list, exposing this as public Docs .
Then I just iterate over this property, passing the number back to Searcher to get the correct 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();
So far, it seems to work just fine in preliminary tests.
Update: Here's the IntegralCollector code:
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 ) { } }
devios1
source share