2013-04-03 3 views
0

Можно ли сократить время поиска с использованием Hitcollector Lucene, и если да, то как это будет правильно реализовано в следующей ситуации?Улучшить скорость поиска 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); 
} 

Из того, что я понимаю, что это не было бы желательно, чтобы получить документы из SearchResults используя Searcher.Doc но иметь hitcollector. Я попытался получить hitcollector, но в итоге смутился. Любая помощь приветствуется!

EDIT: Для того, чтобы выяснить, что меня беспокоит:

Для хорошей производительности поиска, реализации этого метода не должны вызова 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 даст нам дополнительную производительность. Если вам не нужно использовать HitCollector при вызове Searcher.Search (params), как указано в первом ответе, я в порядке. Можете ли вы подтвердить это?

ответ

3

HitCollector устарел в 2.9 и полностью удален из 3.0. Не используйте его.

Если вам это нужно, вы должны реализовать свой собственный Collector. Обычно это полезно, если вы хотите получить исходные результаты поиска, которые необходимы для таких вещей, как пользовательский подсчет, фильтрация и т. Д.

Не совсем понятно, что вы просите здесь, но с кодом, который вы отправили вы ничего не делаете, и вам кажется, что нужно «Топ-результаты».

Поэтому вы должны использовать TopDocsCollector, который автоматически используется методом Searcher.Search(Query,int).

Я также рекомендую вам прочитать документ из метода Searchable.Search(Weight weight, Filter filter, Collector collector):

нижнего уровня API поиска.

Collector.collect (int) вызывается для каждого документа. На основе коллектора доступ к удаленным индексам не рекомендуется.

Применения должны использоваться только в том случае, если им нужны все соответствующие документы . API поиска на высоком уровне (Searcher.search (Query, int)) обычно более эффективен, так как он пропускает нечетные оценки.

+0

Большое спасибо за этот ответ. Из того, что я понимаю, мне не нужно использовать hitcollector, поскольку я действительно не делаю ничего интересного после извлечения документов. Я думал, что общий сбор заработанных очков может быть улучшен с использованием HitCollector. Если этот Searcher.Search уже использует hitcollector, это кажется прекрасным. – Younes

Смежные вопросы