使用hitcollector提高Lucene搜索速度

时间:2013-04-03 11:47:55

标签: performance lucene lucene.net

是否可以通过使用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,我很好。请你确认一下吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

  

低级搜索API。

     

为每个文档调用Collector.collect(int)。收藏家为主   不鼓励访问远程索引。

     

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