一 序
本文屬於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 參數調整
- 獲得最佳匹配語句的評分
- 將其他匹配語句的評分 與 tie_breaker 相乘
- 對以上評分求和並規範化
- Tie Breanker 是一個介於 0-1 之間的浮點數。0 代表使用最佳匹配 l;1 代表所有語句同等重要。
文檔2 評分比文檔1高。可以看出文檔2的紅圈比文檔1出現多。
小結:
默認的bool查詢,should影響評分。
如果默認的不符合預期,可以引入Disjunction Max Query 調整評分。