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 を使用することはお勧めできません。ヒットコレクターを入れようとしましたが、混乱してしまいました。どんな助けでも大歓迎です!

編集:私が心配していることを明確にするために:

検索パフォーマンスを向上させるために、このメソッドの実装では、検出されたすべてのドキュメント番号で Searcher.doc(int) または org.apache.lucene.index.IndexReader.document(int) を呼び出さないでください。これを行うと、検索が 1 桁以上遅くなる可能性があります。

参照: 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 に答える