elasticsearch 組合查詢

組合查詢

在 組合過濾器 中,我們討論過如何使用 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 語句的數量,它既可以是一個絕對的數字,又可以是個百分比:

elasticsearch 組合查詢

<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" 。如果有文檔包含所有三個條件,它會比只包含兩個的文檔更相關。


分享到:


相關文章: