Elasticsearch核心技術與實戰學習筆記 第四章 28單字符串多字段查詢:Dis Max Query

一 序

  本文屬於Elasticsearch核心技術與實戰學習筆記系列。

二 單字符串查詢

屬於常見的查詢,搜索引擎只允許一個輸入框查詢。

準備數據:

PUT /blogs/_doc/1
{
    "title": "Quick brown rabbits",
    "body":  "Brown rabbits are commonly seen."
}

PUT /blogs/_doc/2
{
    "title": "Keeping pets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}

爲啥排序是這樣的結果呢?下面看下算分過程。 

算分過程

  • 查詢 should 語句中的兩個查詢
  • 加和兩個查詢的評分
  • 乘以匹配語句的總數
  • 除以所有語句的總數

文檔1 的標題跟body都包含了Brown,文檔2 雖然body包含了bown fox,但是標題中沒有,導致算分低,導致兩者相加的時候評分低。影響了最終的分數。

"explain": true

看下:

Disjunction Max Query 查詢

上列中,title 和 body 相互競爭

  • 不應該將分數簡單疊加,而是應該找個單個最佳匹配的字段的評分

Disjunction Max Query

  • 將任何與任一查詢匹配的文檔作爲結果返回。採用字段上最匹配的評分返回

換個場景

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ]
        }
    }
}

這次的查詢條件,qucik pets 再文檔裏面都沒有完全匹配的。看下結果

得分一樣的。因爲quick pets分別出現在文檔中。根據最高算分算,所以算分一樣的。

通過 Tie Breaker 參數調整

  1. 獲得最佳匹配語句的評分
  2. 將其他匹配語句的評分 與 tie_breaker 相乘
  3. 對以上評分求和並規範化
  • Tie Breanker 是一個介於 0-1 之間的浮點數。0 代表使用最佳匹配 l;1 代表所有語句同等重要。

文檔2 評分比文檔1高。可以看出文檔2的紅圈比文檔1出現多。

小結:

  默認的bool查詢,should影響評分。

如果默認的不符合預期,可以引入Disjunction Max Query 調整評分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章