查詢和過濾器上下文
查詢子句的行為取決於它是在查詢上下文中使用還是在過濾器上下文中使用:
查詢上下文
查詢上下文中使用的查詢子句回答了“這個文檔與這個查詢子句的匹配程度如何?”,除了決定文檔是否匹配之外,查詢子句還計算一個表示文檔匹配程度的_score,相對於其他文檔。
當查詢子句被傳遞給query參數時,查詢上下文就生效,例如search API中的query參數。
過濾器上下文
在過濾器上下文中,查詢子句回答了“這個文檔與這個查詢子句匹配嗎?”,答案很簡單,是或者不是 - 沒有計算分數,過濾器上下文主要用於過濾結構化數據,例如:
- 這個
timestamp屬於2015年到2016年的范圍嗎? status字段是否設置為"published"?
頻繁使用的過濾器將自動通過Elasticsearch緩存,以提高性能。
當查詢子句被傳遞給filter參數時,過濾器上下文就生效,例如bool查詢中的filter或must_not參數,constant_score查詢中的filter參數或filter聚合。
下面是一個查詢子句示例,用於search API中的查詢和過濾器上下文,此查詢將匹配滿足以下所有條件的文檔:
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子句用於過濾器上下文,他們會過濾掉不匹配的文檔,但不會影響匹配文檔的分數。
