雖然以前作過 elasticsearch 的項目,可是沒有對整個項目的知識點進行過系統的整理。此次趁着對 elasticsearch 版本的升級的機會(從2.2 升級到 6.3) ,又專門花時間對涉及到的知識點從新梳理了一遍。json
俗話說,好記性不如爛筆頭。爲了加深對 elasticsearch 的理解,後面再作相似項目時更容易撿起來,以及對用到的同窗提供方便。從本文開始,我會對 elasticsearch Query DSL 的知識點進行梳理。dom
在講解時我會盡可能以實例代碼展現的方式進行最直觀的展示。紙上來得終覺淺,絕知此事要躬行。作技術尤爲要注重多實踐,懂了並不表明你就掌握了。強烈建議有志於深刻了解這部份內容的同窗,對文中給出的代碼實例在 sense 中實踐一遍甚至是多遍。elasticsearch
注意: 本文基於 elasticsearch 6.3 版本, 若是您使用的是其餘版本,一些內容可能會有所變化,具體使用時還請以官方文檔爲準ide
Query DSL 是 elasticsearch 的核心,搜索方面的項目大部分時間都耗費在對查詢結果的調優上。所以對 Query DSL 的理解越深刻,越能節省項目時間,並給用戶好的體驗。ui
Elasticsearch 提供了一個完整的 query DSL,而且是 JSON 形式的。它和 AST 比較相似,而且包含兩種類型的語句:code
葉子查詢語句(Leaf Query)htm
用於查詢某個特定的字段,如 match
, term
或 range
等ci
複合查詢語句 (Compound query clauses)文檔
用於合併其餘的葉查詢或複合查詢語句,也就是說複合語句之間能夠嵌套,用來表示一個複雜的單一查詢
DSL (domain-specific language),領域特定語言指的是專一於某個應用程序領域的計算機語言,又譯做領域專用語言。不一樣於普通的跨領域通用計算機語言(GPL),領域特定語言只用在某些特定的領域。
AST(abstract syntax tree), 抽象語法樹是源代碼的抽象語法結構的樹形表現形式。樹上的每一個節點都表示源代碼中的一種結構。之因此說語法是「抽象」的,是由於這裏的語法並不會表示出真實語法中出現的每一個細節。好比,嵌套括號被隱含在樹的結構中,並無以節點的形式呈現;而相似於if-condition-then這樣的條件跳轉語句,可使用帶有兩個分支的節點來表示。
——百度百科
一個查詢語句究竟具備什麼樣的行爲和獲得什麼結果,主要取決於它究竟是處於查詢上下文(Query Context) 仍是過濾上下文(Filter Context)。二者有很大區別,咱們來看下:
Query context 查詢上下文
這種語句在執行時既要計算文檔是否匹配,還要計算文檔相對於其餘文檔的匹配度有多高,匹配度越高,*_score* 分數就越高
Filter context 過濾上下文
過濾上下文中的語句在執行時只關心文檔是否和查詢匹配,不會計算匹配度,也就是得分。
下面來看一個例子
GET /_search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
對上面的例子分析下:
query
參數表示整個語句是處於 query context 中bool
和 match
語句被用在 query context 中,也就是說它們會計算每一個文檔的匹配度(_score)filter
參數則表示這個子查詢處於 filter context 中filter
語句中的 term
和 range
語句用在 filter context 中,它們只起到過濾的做用,並不會計算文檔的得分。這個查詢最簡單,全部的 _score
都是 1.0。
GET /_search { "query": { "match_all": {} } }
它的反面就是 Match None Query, 匹配不到任何文檔(不知道用它來作什麼……)
GET /_search { "query": { "match_none": {} } }
全文本查詢的使用場合主要是在出現大量文字的場合,例如 email body 或者文章中搜尋出特定的內容。
全文查詢主要分爲下面幾種(此處列表中的連接爲官方文檔連接,後續將各部分講解後,會替換爲講解連接):
全文查詢中最主要的查詢,包括模糊查詢(fuzzy matching) 或者臨近查詢(proximity queries)。
和 match
查詢比較相似,可是它會保留包含全部搜索詞項,且位置與搜索詞項相同的文檔。
是一種輸入即搜索(search-as-you-type) 的查詢,它和 match_phrase
比較相似,區別就是會將查詢字符串的最後一個詞做爲前綴來使用。
多字段版本的 match
query
只知道是一種特殊的查詢,具體幹什麼還不清楚,後面弄明白後會再來補充。
支持複雜的 Lucene query String 語法,除非你是專家用戶,不然不推薦使用。
簡化版的 query_string
,語法更適合用戶操做。
本文主要講解了 elasticsearch es 6.3 版本的 Query DSL 概要,Match All Query ,
全文查詢概要等內容。下篇會介紹全文查詢中的 Match 語句,敬請期待。