016-elasticsearch【五】-Query DSL【1】-查詢上下文,過濾上下文、match_all
一、概述
Elasticsearch提供基於JSON的完整查詢DSL來定義查詢。將Query DSL視為查詢的AST,由兩種類型的子句組成:
葉子查詢子句
葉子查詢子句在特定字段中查找特定值,例如匹配,詞條或範圍查詢。這些查詢可以自己使用。
復合查詢子句
復合查詢子句包裝其他葉或復合查詢,並用於以邏輯方式(例如bool或dis_max查詢)組合多個查詢,或者改變它們的行為(如constant_score查詢)。
查詢子句的行為有所不同,具體取決於它們是在查詢上下文還是過濾器上下文中使用。
二、查詢過濾上下文
查詢子句的行為取決於它在查詢上下文中還是在過濾器上下文中使用:
查詢上下文
在查詢上下文中使用的查詢子句回答了“這個文檔如何與此查詢子句匹配?”的問題。除了決定文檔是否匹配之外,查詢子句還會計算一個_score,表示文檔與其他文檔的匹配程度。
過濾上下文
在過濾器上下文中,查詢子句回答“這個文檔是否匹配這個查詢子句”這個問題?答案是一個簡單的是或否 - 沒有計算分數。過濾器上下文主要用於過濾結構化數據,例如
此時間戳記是否在2015至2016年範圍內?
狀態字段是否設置為“已發布”?
經常使用的過濾器將被Elasticsearch自動緩存,以提高性能。 過濾器上下文在查詢子句傳遞給過濾器參數時生效,如bool查詢中的filter或must_not參數,constant_score查詢中的filter參數或過濾器聚合。
以下是搜索API中查詢和過濾器上下文中使用的查詢子句的示例。此查詢將匹配滿足以下所有條件的文檔:
標題字段包含單詞Search。
內容字段包含單詞elasticsearch。
狀態字段包含published單詞。
publish_date字段包含從2015年1月1日起的日期。
GET /_search { //查詢參數指示查詢上下文。 "query": { //在查詢上下文中使用bool和兩個匹配子句,這意味著它們用於評估每個文檔的匹配程度。 "bool": { "must": [ { "match": { "title": "Search" }}, {"match": { "content": "Elasticsearch" }} ], //過濾器參數指示過濾器上下文。 "filter": [ //term和range範圍子句用於過濾器上下文中。他們會過濾掉不匹配的文件,但不會影響匹配文件的分數。 { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
在查詢上下文中使用查詢子句來處理會影響匹配文檔分數(即文檔匹配程度如何)的條件,並在過濾器上下文中使用所有其他查詢子句。
三、匹配所有查詢
3.1、match_all
最簡單的查詢,匹配所有文檔,給他們所有的1.0的_score。
GET /_search { "query": { "match_all": {} } }View Code
_score可以用boost參數改變:
GET /_search { "query": { "match_all": { "boost" : 1.2 } } }View Code
3.2、match_none
這是match_all查詢的逆過程,它不匹配任何文檔。
GET /_search { "query": { "match_none": {} } }View Code
016-elasticsearch【五】-Query DSL【1】-查詢上下文,過濾上下文、match_all