Lucene中有几个IndexSearcher.Search方法的重载。其中一些需要“top n hits”参数,有些则不需要(这些已经过时,将在Lucene.NET 3.0中删除)。
那些需要“top n”参数的那些实际上会导致整个可能的结果范围内存预分配。因此,当您处于无法估计返回结果计数的情况时,唯一的机会是传递一个随机的大数字以确保返回所有查询结果。由于LOH碎裂,这会导致严重的记忆压力和泄漏。
在没有通过“前n”论证的情况下,是否存在一种没有过时的搜索方式?
先谢谢你们。
答案 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;
}
}