Как искать в Lucene.NET, не указывая лимит «top n»? - PullRequest
3 голосов
/ 21 января 2011

В Lucene есть несколько перегрузок метода IndexSearcher.Search.Некоторые из них требуют аргумента «top n hit», некоторые нет (они устарели и будут удалены в Lucene.NET 3.0).

Те, которые требуют аргумент «top n», фактически вызывают предварительное выделение памяти длявесь этот возможный диапазон результатов.Поэтому, когда вы находитесь в ситуации, когда вы не можете даже приблизительно оценить количество возвращаемых результатов, единственная возможность - передать случайное большое число, чтобы гарантировать, что все результаты запроса будут возвращены.Это вызывает серьезное давление памяти и утечки из-за фрагментации LOH.

Есть ли официальный устаревший способ поиска без передачи аргумента "top n"?

Заранее спасибо, ребята.

1 Ответ

2 голосов
/ 21 января 2011

Я использую 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;
    }
}
...