查詢子句的行爲取決於它是在查詢上下文中使用仍是在過濾器上下文中使用:緩存
查詢上下文中使用的查詢子句回答了「這個文檔與這個查詢子句的匹配程度如何?」,除了決定文檔是否匹配以外,查詢子句還計算一個表示文檔匹配程度的_score
,相對於其餘文檔。elasticsearch
當查詢子句被傳遞給query
參數時,查詢上下文就生效,例如search
API中的query
參數。性能
在過濾器上下文中,查詢子句回答了「這個文檔與這個查詢子句匹配嗎?」,答案很簡單,是或者不是 - 沒有計算分數,過濾器上下文主要用於過濾結構化數據,例如:code
timestamp
屬於2015年到2016年的範圍嗎?status
字段是否設置爲"published"
?頻繁使用的過濾器將自動經過Elasticsearch緩存,以提升性能。文檔
當查詢子句被傳遞給filter
參數時,過濾器上下文就生效,例如bool
查詢中的filter
或must_not
參數,constant_score
查詢中的filter
參數或filter
聚合。it
下面是一個查詢子句示例,用於search API中的查詢和過濾器上下文,此查詢將匹配知足如下全部條件的文檔:ast
title
字段包含單詞search
。content
字段包含單詞elasticsearch
。status
字段包含精確的單詞published
。publish_date
字段包含從2015年1月1日起的日期。GET /_search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
query
參數代表查詢上下文。bool
和兩個match
子句在查詢上下文中使用,這意味着它們用於對每一個文檔匹配的程度進行打分。filter
參數表示過濾器上下文。term
和range
子句用於過濾器上下文,他們會過濾掉不匹配的文檔,但不會影響匹配文檔的分數。在查詢上下文中使用查詢子句來處理可能影響匹配文檔得分的條件(即文檔匹配的程度),並在過濾器上下文中使用全部其餘查詢子句。