es-控制相關度-打分


相關度評分背后的理論

// 附錄8

總述: 匹配文檔+實用評分函數打分

Lucene(或 Elasticsearch)使用 布爾模型(Boolean model) 查找匹配文檔,
並用一個名為 實用評分函數(practical scoring function) 的公式來計算相關度。
這個公式借鑒了 詞頻/逆向文檔頻率(term frequency/inverse document frequency) 和 向量空間模型(vector space model),
同時也加入了一些現代的新特性,如協調因子(coordination factor),字段長度歸一化(field length normalization),以及詞或查詢語句權重提升。

字段長度歸一化

什么是相關性?&explain // TODO

https://www.cnblogs.com/yudidi/p/12841277.html

基本過程

查詢結果
對查詢結果打分

單個詞查詢的打分過程:

一個多詞查詢的打分過程 TODO

修改打分的方法

  1. boost
    綜述: 可以實用boost的幾個語句: match、multi_match、simple_query_string或query_string查詢,基於每個詞條或者某個字段來控制boost。// 附錄11

Q: boost的2種形式: boost:value | field^value

// 1. boost單個詞條或字段?
 "match": {
            "description": {
              "query": "elasticsearch big data",
              "boost": 2.5
            }
          }
// 2. 對於跨越多個字段的查詢,如multi_match,用戶可以指定整個multi_match的boost。
"multi_match": {
      "query": "elasticsearch big data",
      "fields": [
        "name",
        "description"
      ],
      "boost": 2.5
    }
// 3. multi_match也可以只對特定字段指定一個boost。
"multi_match": {
      "query": "elasticsearch big data",
      "fields": [
        "name^3",                               # 使用^3后綴,name字段被boost了3倍
        "description"
      ]
    }

1.1 在query-bool-should-某個字段的match語句中設置2個字段boost分為2和1,表示前1個字段比后一個字段重要2倍。 // 附錄4

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
                 給字段title設置boost值=2
          }
        },
        {
          "match": { 
            "content": "quick brown fox"
            // content字段,默認boost=1.
          }
        }
      ]
    }
  }
}

title 查詢語句的重要性是 content 查詢的 2 倍,因為它的權重提升值為 2 。
沒有設置 boost 的查詢語句的值為 1 。

  1. 調整查詢結構中查詢語句的所處層次,從而或多或少改變其重要性。 // 附錄5
// quick OR brown OR red OR fox
"should": [
        { "term": { "text": "quick" }},
        { "term": { "text": "brown" }},
        { "term": { "text": "red"   }},
        { "term": { "text": "fox"   }}
      ]
=>
// quick OR (brown OR red) OR fox
 "should": [
        { "term": { "text": "quick" }},
        { "term": { "text": "fox"   }},
        {
          "bool": {
            "should": [
              { "term": { "text": "brown" }},
              { "term": { "text": "red"   }}
            ]
          }
        }
      ]
  1. 通過boosting的negative對包含負向詞的文檔降權。// 附錄6
    為了達到效果, negative_boost 的值必須小於 1.0 。在這個示例中,所有包含負向詞的文檔評分 _score 都會減半。

  2. constant_score忽略TF/IDF

5. function_score 終極武器 // 附錄12

綜述:

  1. 它允許為每個與主查詢匹配的文檔應用一個或多個函數,以達到改變甚至完全替換原始查詢評分 _score 的目的。
  2. function_score查詢允許用戶指定任何數量的任意函數functions,讓它們作用於匹配了初始查詢的文檔,修改其得分。
  • 5.1 weight關鍵字
    Q: function_score的weight和boost關鍵字的作用方式不同。
    A: weight函數將得分乘以一個常數。注意,普通的boost字段按照標准化來增加分數,而weight是真正將得分乘以確定的數值。

  • 5.2 functions關鍵字
    指定一個函數,函數內使用weight //附錄7
    指定多個函數,每個函數內使用weight // 附錄9

Q: functions每個函數都可以有filter
A: functions列表中的每個函數都可以指定一個 filter 過濾器,在這種情況下,函數只會被應用到那些與過濾器匹配的文檔 // 附錄13

Q: function_score中的過濾 vs. 查詢
A: function_score 查詢接受 query 或 filter 作為主查詢或主過濾,如果沒有特別指定,則默認使用 match_all 查詢。// 附錄14
如果是filter,則返回的基礎分_score都是1.

  • 5.3 得分合並
    得分合並有以下兩種情況:
    從每個單獨的函數而來的得分是如何合並的,這被稱為score_mode。
    從函數而來的得分是如何同原始查詢得分合並的,這被稱為boost_mode。

Q: score_mode的主要作用呢
A: 把多個結果縮減為1個結果,然后和_score進行合並。
A: 每個函數返回一個結果,所以需要一種將多個結果縮減到單個值的方式,然后才能將其與原始評分 _score 合並。// 附錄15
所以, 假設有3個函數,f1,f2,f3, score_mode=sum, boost_mode=multiply
那么對文檔d1, d1的最終得分 == sum(f1,f2,f3)multiply_score。

Q: score_mode的作用對象
A: 對多個函數的打分結果f1,f2,f3,執行sum/max/min/multiply/first

  • 5.4 field_value_factor函數
    全部的關鍵字如下: TODO每個關鍵字的含義
 "field_value_factor": {
        "field":    "votes",
        "modifier": "log1p",
        "factor":   0.1
      },
      "boost_mode": "sum",
      "max_boost":  1.5 

Q: field_value_factor配置轉換成計算公式(modifier(field*factor)) // 附錄16
A:

 "field_value_factor": {
                "field": "likes",
                "factor": 1.2,
                "modifier": "sqrt",
                "missing": 1
            }
// 會被翻譯為如下公式
sqrt(1.2 * doc['likes'].value)
  • 5.5 function_score+functions的書寫格式 //附錄10
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "weight": 1.5,
          "filter": {
            "term": {
              "description": "hadoop"
            }
          }
        },
        {
          "field_value_factor": {
            "field": "reviews",
            "factor": 10.5,
            "modifier": "log1p",
            "missing": 0
          }
        },
        {
          "script_score": {
            "script": {
              "source": "if (doc[\u0027attendees\u0027].value != null) { Math.log(doc[\u0027attendees\u0027].values.size() * params.myweight)} else _score",
              "params": {
                "myweight": 3
              }
            }
          }
        },
        {
          "gauss": {
            "location_event.geolocation": {
              "origin": "40.018528,-105.275806",
              "offset": "100m",
              "scale": "2km",
              "decay": "0.5"
            }
          }
        }
      ],
      "score_mode":"sum",
      "boost_mode":"replace"
    }
  }
}
  • 5.6 腳本打分 //TODO

ES打分機制和es的function_score(TODO)

https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl-function-score-query.html#

ES打分機制

  1. TF-IDF算法計算文檔得分 // 附錄1: 基本上就是網頁排名(pagerank)*相關性(TF-IDF)。

boost_mode

"boost_mode": "multiply", // query score and function score is multiplied (default)

參考

  1. 數學之美-第11章 如何確定網頁和查詢的相關性。
  2. 查詢打分和自定義打分相乘得最終得分
  3. 觸類旁通Elasticsearch:打分
  4. boost關鍵提升字段權重
  5. 調整should語句的組合關系, quick OR (brown OR red) OR fox
  6. 所有包含負向詞的文檔評分 _score 都會減半
  7. weight*_score,但是boost按照標准化來增加分數TODO--五、function_score
  8. bool匹配,
  9. 五、function_score--functions--多個函數
  10. (7)綜合示例
  11. 二、boosting

https://time.geekbang.org/course/detail/100030501-108287

  1. 五、function_score
  2. 過濾集提升權重--functions中的函數只會被應用到那些與過濾器匹配的文檔
  3. 過濾集提升權重--過濾_vs_查詢
  4. 過濾集提升權重--評分模式 score_mode
  5. field_value_factor轉換成公式的例子


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM