5

検索構成またはドキュメント コンテンツに必要な微調整を行うことができるように、lucene が検索をどのようにスコア付けしたかをよりよく理解しようとしています。

以下はスコア内訳の一部です。

の製品:

    0.34472802 = queryWeight, product of:
        2.2 = boost
        7.880174 = idf(docFreq=48, maxDocs=47667)
        0.019884655 = queryNorm
      1.9700435 = fieldWeight in 14363, product of:
        1.0 = tf(freq=1.0), with freq of:
          1.0 = termFreq=1.0
        7.880174 = idf(docFreq=48, maxDocs=47667)
        0.25 = fieldNorm(doc=14363)
0.26806915 = (MATCH) max of:
  0.07832639 = (MATCH) weight(shortDescription:tires^1.1 in 14363) [DefaultSimilarity], result of:
    0.07832639 = score(doc=14363,freq=1.0 = termFreq=1.0

それが私の構成値であるため、ブーストがどのように計算されるかを理解しています

しかし、idf はどのように計算されましたか (7.880174 = idf 値)。

lucene によると、idf 式は idf(t) = 1 + log(numDocs/(docFreq+1)) です。

コア管理コンソールを確認したところ、docFreq = maxDocs = 47667 であることがわかりました。

lucene の式を使用して、予想される 7.880174 を計算できませんでした。代わりに、idf = 3.988 = 1 + log(47667/(48+1)) を取得します。

私の式に欠けているものはありますか?

4

2 に答える 2

8

あなたのlog関数はベースとして 10 を選択し、ルセンではベースとしてeを選択すると思います。

log(47667/(48+1), 10) = 2.9880217397306
log(47667/(48+1), e) = 6.8801743154459

idflucene のメソッドのソース コードは次のとおりです。

  public float idf(int docFreq, int numDocs) {
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
  }

ご覧のとおり、idfJavaMath.logを使用して計算し、関数としてeidfMath.log選択します。詳細については、 Java Math APIを参照してください。log

于 2012-12-07T00:48:37.150 に答える
3

lucene サイトにタイプミスがあるようです。

http://lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/search/Similarity.html

状態 1 + ログ (numDocs/(docFreq+1))

しかし、実際には 1 + ln(numDocs/(docFreq+1)) です

于 2012-12-06T23:48:19.443 に答える