Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Lucene 6819-good-bye-index-time-boost

204 views

Published on

LUCENE-6819 & LUCENE-7730 の背景説明

Published in: Internet
  • Be the first to comment

  • Be the first to like this

Lucene 6819-good-bye-index-time-boost

  1. 1. LUCENE-6819 Good bye index-time boost 8/24/17 Koji Sekiguchi @kojisays
  2. 2. LUCENE-6819による変更 • Lucene/Solr 6.5.0 にて関連するコードが @deprecated にマークされた。また、データ投入 時にboost!=1.0の値が指定されていると、警告が表 示される。 • Lucene/Solr 7.0.0 にて、インデックス時重み指定 ができなくなり、参照している部分も削除された。
  3. 3. 背景 • 旧DefaultSimilarityの実装に強く依存していた。 • fieldNorm = lengthNorm * boost • fieldNormが1バイトのfloatでインデックスに保存されており、低精度。boostはコン トロールしようがないが、これが取り除ければ0 <= fieldNorm <= 1の範囲で抑える ことができ、精度を高く保つ努力が報われる。 • かつ、ほとんどの人はboostを指定しない。 • (すでにBM25Similarityがデフォルトとなり、オリジナルのBM25にはboostという考 えがなかったが、LuceneのBM25には文書長を考慮する部分にboostが掛けられている という独自実装が入っており、気持ち悪かった・・・というのもあると思われる。) • docValuesにboost値を入れればより高精度に重みを指定できる。
  4. 4. LUCENE-6819 • この修正だけでは、相変わらず低精度のまま(0〜 255の範囲が有効に使えていない(グレー部分)) 〜〜〜〜 1byte (fieldNorm) Float.MAX_VALUE0 1(boostを使わない場合の最大値)
  5. 5. 今後のindex-time boost • 今後はdocValuesにブースト値を入れてスコアに加味す る。 • Luceneの場合:FunctionScoreQuery • Solrの場合:従来のFunctionQuery • 使い方(Solrの場合) • techproductsではweightがdocValuesになっているので 、q=_val_:”product(weight)”などとする。
  6. 6. 関連チケット LUCENE-7730 (7.0) lengthNorm のよりよいエンコーディングのための改善。長さ(単語 数)40まではそのままエンコーディングされる(その後徐々にずれる )。BM25Similarityがデフォルトなので、1/sqrt(numTerms)計算後の 値ではなく、numTermsそのものを入れることにした。 LUCENE-7623 (6.5) FunctionScoreQuery と FunctionMatchQuery の追加。 LUCENE-7377 (提案中) ClassicSimilarityの削除。
  7. 7. omitNormsとの関連 • omitNormsは相変わらず有効。LUCENE-6819で行ったのは、 fieldNorm = lengthNorm * boost から boost を切り離したこと。相変わ らず fieldNorm = lengthNorm はLUCENE-6819後も低精度でインデッ クスに保存されている。 • boostはどんな値も設定されるので、fieldNormがどんな値になるの か制御できない。 • LUCENE-7730で短い文章においてfieldNormに差がつくように改善し た。 • LUCENE-6819によりboostを切り離したことで、LUCENE-7730の 苦労が報われる。
  8. 8. fieldNorms値の違い • Lucene 7.0 • 〜 Lucene 6.x 87 fieldNorm (1byte) 1000 984 SmallFloat.intToByte4(1000) → 87 SmallFloat.byte4ToInt(87) → 984 104 fieldNorm (1byte) 1000 1024 SmallFloat.floatToByte315(boost/sqrt(1000)) → 104 boost==1のとき、1/sqrt(1000)=0.03162277660168 SmallFloat.byte315ToFloat(104) → 0.031250
  9. 9. SmallFloat a b numTerms SmallFloat.intToByte4(numTer ms) SmallFloat.byte4ToInt(a) SmallFloat.floatToByte315(boost/ sqrt(numTerms)) SmallFloat.byte315ToFloat(b) 0 0 0 1 1 1 124 1.000000 2 2 2 121 0.625000 3 3 3 120 0.500000 4 4 4 120 0.500000 : : : : : 40 40 40 113 0.156250 41 40 40 112 0.125000 42 41 42 112 0.125000 43 41 42 112 0.125000 : : : : : 1000 87 984 104 0.031250 7.0(LUCENE-7730) 〜 6.x
  10. 10. LUCENE-7730 • fieldNormを有効に使う修正 〜〜〜〜 1byte (fieldNorm) Integer.MAX_VALUE0 40

×