Как искать Lucene.NET, не указывая лимит "top n"?
В Lucene есть несколько перегрузок метода IndexSearcher.Search. Некоторые из них требуют аргумента "top n hit", некоторые нет (они устарели и будут удалены в Lucene.NET 3.0).
Те, которые требуют аргумента "top n", фактически вызывают предварительное выделение памяти для всего этого возможного диапазона результатов. Поэтому, когда вы находитесь в ситуации, когда вы не можете даже приблизительно оценить количество возвращаемых результатов, единственная возможность - передать случайное большое число, чтобы гарантировать, что будут возвращены все результаты запроса. Это вызывает серьезное давление памяти и утечки из-за фрагментации LOH.
Есть ли официальный, не устаревший способ поиска без передачи аргумента "top n"?
Заранее спасибо, ребята.
1 ответ
Я использую Lucene.NET 2.9.2 в качестве ориентира для этого ответа.
Вы можете создать собственный коллектор, который вы передаете одной из перегрузок поиска.
using System;
using System.Collections.Generic;
using Lucene.Net.Index;
using Lucene.Net.Search;
public class AwesomeCollector : Collector {
private readonly List<Int32> _docIds = new List<Int32>();
private Scorer _scorer;
private Int32 _docBase;
public IEnumerable<Int32> DocumentIds {
get { return _docIds; }
}
public override void SetScorer(Scorer scorer) {
_scorer = scorer;
}
public override void Collect(Int32 doc) {
var score = _scorer.Score();
if (_lowerInclusiveScore <= score)
_docIds.Add(_docBase + doc);
}
public override void SetNextReader(IndexReader reader, Int32 docBase) {
_docBase = docBase;
}
public override bool AcceptsDocsOutOfOrder() {
return true;
}
}