2011-06-27 2 views
3

Luceneでtf-idfとは何の関係もないカスタムスコアリング式を実装しようとしています(たとえば、類似度を変更するなど)。Luceneカスタムスコアリング(Lucene 3.2)は、インデックス内のすべてのドキュメントを反復処理することを最速の方法で行います。

これを行うには、カスタムクエリを使用して、インデックスに格納されているすべてのドキュメントのスコアを生成する必要があります。本質的に同義語であるため、文書に正確な用語がない場合でも、依然として肯定的なスコアを生成する可能性があります)。 IndexReaderを作成し、すべてのドキュメント(here)のDocument d = reader.doc(i)を呼び出して、その場でスコアを生成するのに最適な方法はありますか?

私は、Luceneのスコアリング内部、特に様々なScorerとCollectorクラスを見てきました。Lucene 3.2の場合、WeightはScorerを提供し、Collectorはすべてのドキュメントをループします。クエリと一致します。この構造を何らかの方法で利用できますか?しかし、すべてのドキュメントを考慮するためにScorerのカスタム実装を再度利用できますか?

+0

私はあなたが実装しようとしているスコアの種類について非常に興味があります。 –

答えて

0

私はLuceneのを理解するように、そのクエリが

  1. として実装されているので、それは
  2. スコア/それらを並べ替え、クエリ用語を含む文書を取得し、そのインデックスでは(用語、DOC)のペアを格納します。

自分のスコアリングを実装したことはありませんが、最初にIndexReader.termDocsを見ていきます。

0

IndexReader.termDocsを使用すると、用語の投稿リスト、つまりその用語を含むすべてのドキュメントを反復することができます。これを使用して、独自のクエリーをLuceneのトップに処理することができますが、Query,などは使用できません。

また、同義語を使用している場合Lucene has some things in the contrib package。あなたが試したかどうかわからない別の解決策は、同義語をAnalyzer(またはその他)を介して文書に挿入することです。そうすれば、たとえクエリの条件がなくてもドキュメントを返すことができます。

2

カスタムスコアリングスキームを使用する場合は、CustomScoreQueryのサブクラスを使用して、getCustomScoreProviderをオーバーライドしてサブクラスCustomScoreProviderを返すことが適切です。 CustomScoreQueryコンストラクタにはサブクエリが必要です。ここでは、カスタムスコア計算を実行する前に、可能な限り結果セットを絞り込む高速のネイティブLuceneクエリを提供したいと考えています。また、各ドキュメントに任意の数の浮動小数点値を格納し、それらをカスタムスコアプロバイダにアクセスできるようにすることもできます。このような浮動小数点値ごとにCustomScoreQueryのコンストラクタに適切なValueSourceQueryを指定する必要があります。これらのクラスのJavadocを参照してください。うまく書かれています。残念ながら、私は手元にJavaスニペットを持っていません。

関連する問題