gpt4 book ai didi

c# - 从 Lucene 中的查询中检索所有匹配文档的最有效方法是什么,未排序?

转载 作者:太空狗 更新时间:2023-10-29 21:47:09 32 4
gpt4 key购买 nike

我希望执行查询以维护内部完整性;例如,从索引中删除特定字段/值的所有痕迹。因此,找到所有匹配的文档(不仅仅是前 n 个文档)很重要,但它们返回的顺序无关紧要。

根据文档,看起来我需要使用 Searcher.Search( Query, Collector ) 方法,但是没有内置的 Collector 类可以满足我的需要。

我应该为此派生自己的 Collector 吗?这样做时需要注意什么?

最佳答案

事实证明,这比我预期的要容易得多。我刚刚使用了 http://lucene.apache.org/java/2_9_0/api/core/org/apache/lucene/search/Collector.html 中的示例实现并将传递给 Collect() 方法的文档编号记录在列表中,将其公开为公共(public) Docs 属性。

然后我简单地迭代此属性,将数字传回 Searcher 以获取正确的 Document:

var searcher = new IndexSearcher( reader );
var collector = new IntegralCollector(); // my custom Collector
searcher.Search( query, collector );
var result = new Document[ collector.Docs.Count ];
for ( int i = 0; i < collector.Docs.Count; i++ )
result[ i ] = searcher.Doc( collector.Docs[ i ] );
searcher.Close(); // this is probably not needed
reader.Close();

到目前为止,它在初步测试中似乎运行良好。

更新:这是IntegralCollector的代码:

internal class IntegralCollector: Lucene.Net.Search.Collector {
private int _docBase;

private List<int> _docs = new List<int>();
public List<int> Docs {
get { return _docs; }
}

public override bool AcceptsDocsOutOfOrder() {
return true;
}

public override void Collect( int doc ) {
_docs.Add( _docBase + doc );
}

public override void SetNextReader( Lucene.Net.Index.IndexReader reader, int docBase ) {
_docBase = docBase;
}

public override void SetScorer( Lucene.Net.Search.Scorer scorer ) {
}
}

关于c# - 从 Lucene 中的查询中检索所有匹配文档的最有效方法是什么,未排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5434934/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com