組合查詢
在 組合過濾器 中,我們討論過如何使用 bool 過濾器通過 and 、 or 和 not 邏輯組合將多個過濾器進行組合。在查詢中, bool 查詢有類似的功能,只有一個重要的區別。
過濾器做二元判斷:文檔是否應該出現在結果中?但查詢更精妙,它除了決定一個文檔是否應該被包括在結果中,還會計算文檔的 相關程度 。
與過濾器一樣, bool 查詢也可以接受 must 、 must_not 和 should 參數下的多個查詢語句。比如:
<code>GET /my_index/my_type/_search {"query"
: {"bool"
: {"must"
: {"match"
: {"title"
:"quick"
}},"must_not"
: {"match"
: {"title"
:"lazy"
}},"should"
: [ {"match"
: {"title"
:"brown"
}}, {"match"
: {"title"
:"dog"
}} ] } } }/<code>
以上的查詢結果返回 title 字段包含詞項 quick 但不包含 lazy 的任意文檔。目前為止,這與 bool 過濾器的工作方式非常相似。
區別就在於兩個 should 語句,也就是說:一個文檔不必包含 brown 或 dog 這兩個詞項,但如果一旦包含,我們就認為它們 更相關 :
<code>{"hits"
: [ {"_id"
:"3"
,"_score"
:0.70134366
,"_source"
: {"title"
:"The quick brown fox jumps over the quick dog"
} }, {"_id"
:"1"
,"_score"
:0.3312608
,"_source"
: {"title"
:"The quick brown fox"
} } ] }/<code>
文檔 3 會比文檔 1 有更高評分是因為它同時包含 brown 和 dog 。
評分計算
bool 查詢會為每個文檔計算相關度評分 _score ,再將所有匹配的 must 和 should 語句的分數 _score 求和,最後除以 must 和 should 語句的總數。
must_not 語句不會影響評分;它的作用只是將不相關的文檔排除。
控制精度
所有 must 語句必須匹配,所有 must_not 語句都必須不匹配,但有多少 should 語句應該匹配呢?默認情況下,沒有 should 語句是必須匹配的,只有一個例外:那就是當沒有 must 語句的時候,至少有一個 should 語句必須匹配。
就像我們能控制 match 查詢的精度 一樣,我們可以通過 minimum_should_match 參數控制需要匹配的 should 語句的數量,它既可以是一個絕對的數字,又可以是個百分比:
<code>GET /my_index/my_type/_search {"query"
: {"bool"
: {"should"
: [ {"match"
: {"title"
:"brown"
}}, {"match"
: {"title"
:"fox"
}}, {"match"
: {"title"
:"dog"
}} ],"minimum_should_match"
: 2 } } }/<code>
這也可以用百分比表示。
這個查詢結果會將所有滿足以下條件的文檔返回: title 字段包含 "brown" AND "fox" 、 "brown" AND "dog" 或 "fox" AND "dog" 。如果有文檔包含所有三個條件,它會比只包含兩個的文檔更相關。