17

solr 検索結果のスコアリングを改善する方法を考え出そうとしています。私のアプリケーションは、solr の結果からスコアを取得し、クエリに対する結果の良さに応じて、いくつかの「星」を表示する必要があります。星 5 個 = 星 0 個までのほぼ/正確な値は、検索にあまり一致しないことを意味します。たとえば、1 つの要素しかヒットしません。しかし、私は 1.4 から 0.8660254 までのスコアを取得しており、どちらも 5 つ星を与える結果を返しています。私がする必要があるのは、これらの結果をパーセンテージに変換して、正しい数の星でこれらの結果をマークできるようにすることです.

1.4 スコアを得るために実行したクエリは次のとおりです。

euallowed:true AND(グレード:"2:1")

0.8660254 スコアを与えるクエリは次のとおりです。

euallowed:true AND(グレード:"2:1" OR グレード:"1st")

ドキュメント内の用語の数ではなく、ドキュメントに用語がある場合にのみ関心があるため、tf と idf が 1.0 を返すように、Similarity を既に更新しました。これは私の類似コードがどのように見えるかです:

import org.apache.lucene.search.Similarity;

public class StudentSearchSimilarity extends Similarity {

    @Override
    public float lengthNorm(String fieldName, int numTerms) {
        return (float) (1.0 / Math.sqrt(numTerms));
    }

    @Override
    public float queryNorm(float sumOfSquaredWeights) {

        return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));

    }

    @Override
    public float sloppyFreq(int distance) {
        return 1.0f / (distance + 1);
    }

    @Override
    public float tf(float freq) {
        return (float) 1.0;
    }

    @Override
    public float idf(int docFreq, int numDocs) {

        //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
        return (float)1.0;

    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        return overlap / (float) maxOverlap;
    }
}

だから私は私の質問は次のとおりだと思います:

  1. 「星」の数を計算できるように、スコアを正規化するにはどうすればよいですか?

  2. 結果を採点する別の方法はありますか?

ありがとう

許す

4

3 に答える 3

17

http://wiki.apache.org/lucene-java/ScoresAsPercentagesを引用するには:

Lucene スコアから "パーセンテージ" を計算して、"100% 完全" 一致と "50%" 一致の違いを判断したい場合がよくあります。これも「正規化スコア」と呼ばれるものです

これをしないでください。

真剣に。問題をこのように考えようとするのはやめましょう。問題はうまく終わらないでしょう。

そのページでは、理論的にはこれを行う方法の例を示していますが、非常に困難です。

于 2010-10-22T16:31:34.967 に答える
0

Solr でこれほど複雑なことをする必要はなかったので、これをプラグインとしてフックする方法があるかもしれませんが、結果セットが返されたときにクライアントで処理できます。関連性で並べ替えた場合、これは簡単なはずです。最初の結果 (最大) と最後の結果 (最小) の関連性を取得します。次に、関連性 x を持つ各結果について、計算できます。

normalisedValue = (x - min) / (max - min)

これにより、0 から 1 の間の値が得られます。5 を掛けて四捨五入すると、星の数が得られます。

于 2010-10-21T16:12:36.093 に答える