Elasticsearch DSL中Query與Filter的區別

Elasticsearch支持很多查詢方式,除了通過9300(默認)端口通過TCP協議進行查詢,另一種就是DSL,它是把請求寫在JSON裏面,然後進行相關查詢。

一個DSL例子

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "name":   "Jim" }}, 
        { "match": { "city": "Guangzhou" }}  
      ],
      "filter": [ 
        { "term":  { "weight": "60" }}, 
        { "range": { "age": { "gte": "18" }}} 
      ]
    }
  }
}

查詢的種類

Elasticsearch中的DSL主要由兩部分組成:

Leaf query Cluase 葉查詢子句:
這種查詢可以單獨使用,針對某一特定的字段查詢特定的值,比如match、term、range等

Compound query Cluase複合查詢子句:
這種查詢配合其他的葉查詢或者複合查詢,用於在邏輯上,組成更爲複雜的查詢,比如bool


Query與Filter

查詢在Query查詢上下文和Filter過濾器上下文中,執行的操作是不一樣的:

1、查詢上下文:是在使用query進行查詢時的執行環境,比如使用search的時候。
在查詢上下文中,查詢會回答這個問題——“這個文檔是否匹配這個查詢,它的相關度高麼?
ES中索引的數據都會存儲一個_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,對於某個搜索的分值計算還是需要一定的時間消耗。

2、過濾器上下文:在使用filter參數時候的執行環境,比如在bool查詢中使用Must_not或者filter
在過濾器上下文中,查詢會回答這個問題——“這個文檔是否匹配?
它不會去計算任何分值,也不會關心返回的排序問題,因此效率會高一點。
另外,經常使用過濾器,ES會自動的緩存過濾器的內容,這對於查詢來說,會提高很多性能。

總而言之:
1 查詢上下文:查詢操作不僅僅會進行查詢,還會計算分值,用於確定相關度;

2 過濾器上下文:查詢操作僅判斷是否滿足查詢條件,不會計算得分,查詢的結果可以被緩存。

所以,根據實際的需求是否需要獲取得分,考慮性能因素,選擇不同的查詢子句。



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