1

Luceneインデックス内のドキュメントの用語の検索を更新しようとしています。現在、検索スコアは、その用語がドキュメントに表示された回数に基づいています。私がやりたいのは、用語が存在する回数ではなく、用語が存在する場合のスコアです。したがって、用語が含まれているドキュメントは、用語が含まれているドキュメントと同じスコアを100回取得します。

Zend_Search_Lucene_Search_Similarityを自分のクラスで拡張しようとしましたが、正直なところ、スコアがまだかなり低いため、これが正しく機能しているかどうかはわかりません。

class MySimilarity extends Zend_Search_Lucene_Search_Similarity{

//override the default frequency of searching
public function tf($freq){
    return 1.0; 
}

public function lengthNorm($fieldName, $numTerms) {
    return 1.0/sqrt($numTerms);
}

public function queryNorm($sumOfSquaredWeights) {
    return 1.0/sqrt($sumOfSquaredWeights);
}

public function sloppyFreq($distance) {
    return 1.0;
}

public function idfFreq($docFreq, $numDocs) {
    return log($numDocs/(float)($docFreq+1)) + 1.0;
}

public function coord($overlap, $maxOverlap) {
    return $overlap/(float)$maxOverlap;
}
}

今、これは古き良きグーグルを検索したときに私が見つけた例から構築されています。しかし、私が行った唯一の実際の変更は、tf()関数です。

これに関するどんな助けでも、そして今それが私の検索を本当に台無しにしているので、私は本当に素晴らしいでしょう。

ありがとう、

許す

4

1 に答える 1

0

私はこれをデバッグするために2つのことを試みます:

  1. 非常に小さなインデックスを作成します。2つのドキュメント、それぞれに1つのフィールドがあり、最初のドキュメントには「boat」という単語があり、2番目のドキュメントには「boatboat」というフレーズがあります。その上で検索をテストします。
  2. tf()関数のみをオーバーライドしてみてください。これはあなたが望む変化です。ノルムなどの他の部分をオーバーライドするには、新しい類似度関数を使用してインデックスを再作成する必要があります。インデックスを再作成する前に、これが実際に必要であることを確認してください。

全体として、tf()関数を変更することは正しいことのようです。これは、相対的な順序のみが必要で、絶対スコアを気にしない場合に限ります。

于 2010-07-20T07:57:01.233 に答える