Как искать 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;
    }
}
Другие вопросы по тегам