天天看點

Elasticsearch查詢——布爾查詢Bool Query

Elasticsearch在2.x版本的時候把filter查詢給摘掉了,是以在query dsl裡面已經找不到filter query了。其實es并沒有完全抛棄filter query,而是它的設計與之前的query太重複了。是以直接給轉移到了bool查詢中。

Bool查詢現在包括四種子句,must,filter,should,must_not。

Elasticsearch查詢——布爾查詢Bool Query

看上面的流程圖就能很明顯的看到,filter與query還是有很大的差別的。

比如,query的時候,會先比較查詢條件,然後計算分值,最後傳回文檔結果;

而filter則是先判斷是否滿足查詢條件,如果不滿足,會緩存查詢過程(記錄該文檔不滿足結果);滿足的話,就直接緩存結果。

綜上所述,filter快在兩個方面:

1 對結果進行緩存

2 避免計算分值

Bool查詢對應Lucene中的BooleanQuery,它由一個或者多個子句組成,每個子句都有特定的類型。

傳回的文檔必須滿足must子句的條件,并且參與計算分值

傳回的文檔必須滿足filter子句的條件。但是不會像Must一樣,參與計算分值

傳回的文檔可能滿足should子句的條件。在一個Bool查詢中,如果沒有must或者filter,有一個或者多個should子句,那麼隻要滿足一個就可以傳回。<code>minimum_should_match</code>參數定義了至少滿足幾個子句。

傳回的文檔必須不滿足must_not定義的條件。

如果一個查詢既有filter又有should,那麼至少包含一個should子句。

bool查詢也支援禁用協同計分選項disable_coord。一般計算分值的因素取決于所有的查詢條件。

bool查詢也是采用more_matches_is_better的機制,是以滿足must和should子句的文檔将會合并起來計算分值。

在filter子句查詢中,分值将會都傳回0。分值會受特定的查詢影響。

比如,下面三個查詢中都是傳回所有status字段為active的文檔

第一個查詢,所有的文檔都會傳回0:

下面的bool查詢中包含了一個match_all,是以所有的文檔都會傳回1

constant_score與上面的查詢結果相同,也會給每個文檔傳回1:

如果想知道到底是bool裡面哪個條件比對,可以使用named query查詢:

<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html">1 bool查詢</a>

<a href="http://www.cnblogs.com/xing901022/p/5994210.html">2 《Elasticsearch IN Action》</a>

繼續閱讀