0

使用 Lucene 的 Hitcollector 是否可以减少搜索时间?如果可以,在以下情况下如何正确实施?

// search login here ie. 
// this is the search method
// random query
if (!string.IsNullOrEmpty(vendor))
{
   bQuery.Add(qbVendor.Parse(vendor.ToLower()), BooleanClause.Occur.MUST);
}

bQuery.Add(qbWebsite.Parse(website.ToLower()), BooleanClause.Occur.MUST);
TopDocs hits = this.ProductIndexSearcher.Search(bQuery, null, 1000)
return hits.scoreDocs;

这部分将是函数调用:

ScoreDoc[] docs = null;
docs = s.KeywordSearch(keyword, category, Webshop.Context.InSiteWebshopId, null, null).ToList(), 1000

foreach (ScoreDoc d in docs.Take(maxResult))
{                                
   Document doc = this.ProductIndexSearcher.Doc(d.doc);
}

据我了解,不建议使用 Searcher.Doc 从搜索结果中获取文档,而是使用 hitcollector。我试图让一个hitcollector加入,但结果很混乱。任何帮助将非常感激!

编辑:澄清我担心的是:

为了获得良好的搜索性能,此方法的实现不应在遇到的每个文档编号上调用 Searcher.doc(int) 或 org.apache.lucene.index.IndexReader.document(int)。这样做会使搜索速度减慢一个数量级或更多。

参考: http: //grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/2.9.1/org/apache/lucene/search/HitCollector.java

所以我只是想知道添加一个 hitcollector 是否会给我们带来一些额外的性能。如果在第一个答案中指定调用 Searcher.Search(params) 时不需要使用 HitCollector,我可以。你能确认一下吗?

4

1 回答 1

3

HitCollector在 2.9 中已弃用,并从 3.0 中完全删除。不要使用它。

如果你需要它,你应该实现你自己的Collector. 如果您想获得搜索的原始结果,这通常很有用,这是自定义评分、过滤等内容所必需的。

它不是很清楚你在这里要求什么,但是你发布的代码并没有做任何花哨的事情,你似乎想要“前 n 个结果”。

因此,您应该使用Searcher.Search(Query,int)方法自动使用的 TopDocsCollector 。

我还建议您阅读Searchable.Search(Weight weight, Filter filter, Collector collector)方法中的文档:

较低级别的搜索 API。

每个文档都会调用 Collector.collect(int)。不鼓励基于收集器访问远程索引。

应用程序仅在需要所有匹配文档时才应使用它。高级搜索 API (Searcher.search(Query,int)) 通常更高效,因为它会跳过非高分命中。

于 2013-04-03T15:11:44.030 回答