2012-03-26 20 views
2

私たちのプロジェクトの1つでは、古いLuceneバージョン(2.3.2)を使用しています。現在のLuceneバージョン(3.5.0)を見て、古いコードを書き直そうとしています。古いプロジェクトでは、TopFieldDocCollectorを拡張して、collect()メソッドで追加のフィルタリングを行いました。私は新しいCollectorクラスを理解するのに少し苦労していますが、良い例は見つけられませんでした。Lucene HitCollector(2.x)からCollector(3.x)への移行

1)メソッドsetScorer()。どのように/どこからScorerオブジェクトを取得するのですか?

2)メソッドcollect()。私は自分のコレクションを作成し、興味のあるdocIdsを保存する必要があると思いますが、正しいですか?

3)代わりにTopDocsCollectorを拡張する場合、コンストラクタで使用するPriorityQueueを実装する必要がありますか?そのための標準的な実装はないようです。しかし、私はまだdocIds(またはむしろScoreDocs)を格納するために私自身のコレクションが必要であり、検索が終了した後にpopulateResultsを呼び出しますか?

全体として、TopDocsCollectorを拡張するよりもコレクタを拡張するほうが簡単ですが、何か不足している可能性があります。

答えて

4
  1. setScorer()それは、実際に検索を行う際に得点がIndexSearcherによって渡され、フックです。だから、もしあなたがスコアについて気にしているならば、あなたは基本的にこのメソッドをオーバーライドします(例えば、渡されたScorerを保存するなどして使用できます)。そのjavadocsから:

    {@link #collect(int)}を連続して呼び出す前に呼び出されます。現在のドキュメントのスコアを必要とする実装 は、渡されたScorerを保存し、必要に応じて scorer.score()を呼び出す必要があります( {@link #collect(int)}に渡されます)。

  2. collect()は、一致するドキュメントごとに、セグメントごとのdocidを渡して呼び出されます。 「すべてのセグメントに渡ってリーダー全体に相対的な」「rebased docid」が必要な場合は、setNextReaderをオーバーライドし、docBaseを保存し、docBase + docidを計算する必要があります。コレクタからjavadocs:

    注: の収集方法に渡されるドキュメントは、現在の読者に関連しています。 コレクタで Multi * ReaderのdocIDスペースに解決する必要がある場合は、最新のsetNextReaderコールから docBaseを記録して再構築する必要があります。

  3. TopDocsCollectorは、TopFieldCollector(フィールド順に並べ替える)とTopScoreDocCollector(スコア順に並べ替える)の基本クラスです。スコアで並べ替えるカスタムコレクタを作成している場合は、TopScoreDocCollectorを拡張するほうが簡単でしょう。

また、最も単純なコレクタの例は、TotalHitCountCollector!です。

+0

ありがとうございます。 setScorer()について知っておきたいことは、APIのドキュメントを理解できず、Scorerを自分で作成してスコアを取得する必要があると考えました。 –

関連する問題