2017-03-03 61 views
1

我在使用不同的方法時收到不同的_scores,但我期待着相同的結果。elasticsearch function_score返回意想不到的分數

第一種方法是使用script_score,與字段值乘以_score,並用計算出的一個與boost_mode替換最終_score =取代

{ 
    "function_score": { 
     "query": { 
      "multi_match": { 
       "query": "body", 
       "fields": ["title", "text", "keywords"], 
       "operator": "and" 
      } 
     }, 
     "functions": [{ 
      "script_score": { 
       "script": { 
        "lang": "groovy", 
        "inline": "_score * doc['power'].value" 
       } 
      } 
     }], 
     "boost_mode": "replace" 
    } 
} 

第二個是使用script_score只返回字段的值,並通過讓發動機計算_score使用boost_mode = multiply

{ 
    "function_score": { 
     "query": { 
      "multi_match": { 
       "query": "body", 
       "fields": ["title", "text", "keywords"], 
       "operator": "and" 
      } 
     }, 
     "functions": [{ 
      "script_score": { 
       "script": { 
        "lang": "groovy", 
        "inline": "doc['power'].value" 
       } 
      } 
     }], 
     "boost_mode": "multiply" 
    } 
} 

爲什麼查詢返回不同的_scores?

+0

我得到了與預期相同的分數,使用替換或乘法 – user3775217

回答

1

在你的分數的差異可能是因爲Query Normalization Factor

,這樣從一個查詢的結果可能會與 結果進行對比查詢規範化因子(queryNorm)是正常化 查詢企圖另一個。

儘管查詢規範的目的是使不同查詢的結果具有可比性,但它不能很好地工作。相關性_score的唯一目的是按正確的順序對當前查詢的結果進行排序。您不應該嘗試比較不同查詢的相關性分數。

現在,

乘法:查詢分數和功能評分乘以

更換:當您使用boost_mode=multiply只使用功能評分,查詢分數被忽略

,查詢得分正在歸一化,而當您使用boost_mode=replace時,得分將被替換爲function score,因此查詢得分被忽略,因此查詢沒有標準化分數

相關問題