3

LuceneにはIndexSearcher.Searchメソッドのオーバーロードがいくつかあります。それらのいくつかは「トップnヒット」引数を必要とし、いくつかは必要としません(これらは廃止され、Lucene.NET 3.0で削除されます)。

「topn」引数を必要とするものは、実際には、この可能な結果の範囲全体に対してメモリの事前割り当てを引き起こします。したがって、返される結果の数を概算することさえできない状況にある場合、唯一の機会は、すべてのクエリ結果が返されることを保証するためにランダムな大きな数を渡すことです。これにより、LOHの断片化により、深刻なメモリプレッシャーとリークが発生します。

「topn」引数を渡さずに検索するための公式で時代遅れではない方法はありますか?

よろしくお願いします。

4

1 に答える 1

2

この回答の参照ポイントとしてLucene.NET2.9.2を使用しています。

検索オーバーロードの1つに渡すカスタムコレクターを作成できます。

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;
    }
}
于 2011-01-21T12:52:56.677 に答える