如何搜索Lucene.NET而不指示“前n”命中限制?

时间:2011-01-21 09:46:50

标签: search memory lucene heap fragmentation

Lucene中有几个IndexSearcher.Search方法的重载。其中一些需要“top n hits”参数,有些则不需要(这些已经过时,将在Lucene.NET 3.0中删除)。

那些需要“top n”参数的那些实际上会导致整个可能的结果范围内存预分配。因此,当您处于无法估计返回结果计数的情况时,唯一的机会是传递一个随机的大数字以确保返回所有查询结果。由于LOH碎裂,这会导致严重的记忆压力和泄漏。

在没有通过“前n”论证的情况下,是否存在一种没有过时的搜索方式?

先谢谢你们。

1 个答案:

答案 0 :(得分:2)

我正在使用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;
    }
}