1、關於Query context和filter context
查詢語句的表現行為取決於使用了查詢上下文方式還是過濾上下文方式。
-
Query context:查詢上下文,回答了“文檔是如何被查詢語句匹配的”,此外,也決定了文檔是否被匹配上,查詢語句也通過計算_score的值來說明文檔的匹配度。query context查詢方式是通過傳遞query參數來實現。
- Filter context:過濾上下文,回答了“文檔是不是匹配?”,答案一般都是簡單的是和否,並不計算_scores的值,過濾上下文查詢方式大多用於過濾結構化數據,例如:
- 時間戳(timestamp)是否在2015到2016之間?
- 狀態(status)是否是(確切)“published”?
- 過濾上下文通過在bool查詢中傳遞filter或must_not參與來起作用,或者在constant_score查詢,或在filter聚合中起作用。
- 例如:
GET /_search { "query": { #query參數說明是query上下文 "bool": { #bool和兩個match子句在query上下文中,意味着他們使用score來計算如何與文檔匹配。 "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ #filter參數說明是filter上下文 { "term": { "status": "published" }}, # term和range應用於filter上下文,它們將過濾不匹配的文檔,但不會影響匹配文檔的score值。 { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
tip:所以,在需要用score來匹配文檔的情況下使用query context,其他情況使用filter context。