Elasticsearch DSL中Query與Filter的不同


Elasticsearch支持很多查詢方式,其中一種就是DSL,它是把請求寫在JSON里面,然后進行相關的查詢。

舉個DSL例子

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

 

查詢的種類

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

Leaf query Cluase 暫且叫做葉查詢子句吧

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

Compound query Cluase復合查詢子句

這種查詢配合其他的葉查詢或者復合查詢,用於在邏輯上,組成更為復雜的查詢,比如bool

 

查詢雖然包含這兩種,但是查詢在不同的執行環境下,操作還是不一樣的。

Query與Filter

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

查詢上下文:

在查詢上下文中,查詢會回答這個問題——“這個文檔匹不匹配這個查詢,它的相關度高么?”

如何驗證匹配很好理解,如何計算相關度呢?之前說過,ES中索引的數據都會存儲一個_score分值,分值越高就代表越匹配。另外關於某個搜索的分值計算還是很復雜的,因此也需要一定的時間。

查詢上下文 是在 使用query進行查詢時的執行環境,比如使用search的時候。

過濾器上下文:

在過濾器上下文中,查詢會回答這個問題——“這個文檔匹不匹配?”

答案很簡單,是或者不是。它不會去計算任何分值,也不會關心返回的排序問題,因此效率會高一點。

過濾上下文 是在使用filter參數時候的執行環境,比如在bool查詢中使用Must_not或者filter

 

另外,經常使用過濾器,ES會自動的緩存過濾器的內容,這對於查詢來說,會提高很多性能。

總結

1 查詢上下文中,查詢操作不僅僅會進行查詢,還會計算分值,用於確定相關度;在過濾器上下文中,查詢操作僅判斷是否滿足查詢條件

2 過濾器上下文中,查詢的結果可以被緩存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM