是否可以通过使用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) 遇到的号码。这样做会减慢搜索顺序 大小或更多。
所以我只是想知道添加一个hitcollector会给我们一些额外的性能。如果在第一个答案中指定调用Searcher.Search(params)时不需要使用HitCollector,我很好。请你确认一下吗?
答案 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))是 通常更有效率,因为它会跳过非高得分的命中。