個人Elasticsearch系列文章,逐漸更新中,歡迎關注
0A.關於Elasticsearch及實例應用
00.Solr與ElasticSearch對比
01.ElasticSearch能作什麼?
02.Elastic Stack功能介紹
03.如何安裝與設置Elasticsearch API
04.若是經過elasticsearch的head插件創建索引_CRUD操做
05.Elasticsearch多個實例和head plugin使用介紹
06.當Elasticsearch進行文檔索引時,它是如何工做的?
07.Elasticsearch中的映射方式—簡潔版教程
08.Elasticsearch中的分析和分析器應用方式
09.Elasticsearch中構建自定義分析器
10.Kibana科普-做爲Elasticsearhc開發工具html
另外Elasticsearch入門,我強烈推薦ElasticSearch搭建小白指南給你,很是想盡的入門指南手冊。segmentfault
在上一個博客中,咱們瞭解瞭如何將Kibana用做開發工具以及如何使用Kibana加載示例數據。
從這個博客中,咱們將研究Elasticsearch的查詢DSL,它很是強大,對於任何Elasticsearch用戶來講都是必不可少的知識領域。
Elasticsearch查詢類型
Elasticsearch中的查詢能夠大體分爲兩類,
1.葉子查詢
葉子查詢在某些字段中查找特定值。這些查詢能夠獨立使用。其中一些查詢包括匹配,條件,範圍查詢。
2.複合查詢
複合查詢使用葉/複合查詢的組合。基本上,它們將多個查詢組合在一塊兒以實現其目標結果。
下圖大體顯示了這兩個查詢的大體分類:elasticsearch
如上圖所示,Leaf和化合物分類中仍然有許多類別。在接下來的博客中,咱們將更詳細地訪問上圖中的大多數查詢/查詢類型。
基本查詢樣本
如今,讓咱們熟悉葉子的2個基本查詢和複合查詢類型中的一個查詢以開始操做。
1.簡單的「匹配」查詢
假設咱們考慮創建索引的文件在之前的博客,讓咱們嘗試在球場上「FIRST_NAME」爲搜索關鍵詞「丹尼」的簡單匹配查詢。該查詢將以下所示:工具
POST employees/_search { 「query」: { 「match」: { 「country」: 「China」 } } }
上面的查詢將返回給咱們全部國家爲中國的文件
2.範圍查詢
如今讓咱們觸發另外一個查詢,這個查詢也是一個葉子查詢。該查詢將向咱們返回全部薪水大於或等於500,000的員工。可使用以下範圍查詢來實現:開發工具
POST/ _ { 「 query」:{ 「 range」:{ 「 salary」:{ 「 gte」:500000 } } } }
3.布爾查詢
如今來了有趣的部分。咱們如何比較以上查詢?也就是說,我須要全部來自中國但收入超過50萬的員工。
這須要上述兩個葉查詢的組合。如今,Elasticsearch提供了使用bool查詢組合這些查詢的工具。讓咱們討論布爾查詢的通常結構,而後回到問題所在。
布爾查詢的通常結構:spa
POST _search { 「 query」:{ 「 bool」:{ 「 must」:[...], 「 filter」:[...], 「 must_not」:[...], 「 should」:[.. 。] } } }
must:子句(查詢)必須出如今匹配的文檔中,並將有助於得分。
filter:子句(查詢)必須出如今匹配的文檔中。可是與查詢分數不一樣的是,忽略該分數。
應該:子句(查詢)應出如今匹配的文檔中。
must_not:子句(查詢)不得出如今匹配的文檔中。
如今回到咱們的問題,咱們的bool查詢旨在重整全部來自中國的僱員並賺取超過500,000的工資,以下所示:插件
POST employee / _search { 「 query」:{ 「 bool」:{ 「 must」:[ { 「 match」:{ 「 country」:「 China」 } }, { 「 range」:{ 「 salary」:{ 「 gte」 :500000 } } } ] } } }
如今,讓咱們考慮是否要從列表中篩選出全部男性僱員。咱們應該作什麼?。只需在上面的查詢中添加條件性別爲「 Male」的must_not部分便可,以下所示:code
POST employee / _search { 「 query」:{ 「 bool」:{ 「 must」:[ { 「 match」:{ 「 country」:「 China」 } }, { 「 range」:{ 「 salary」:{ 「 gte」 :500000 } } } ], 「 must_not」:[ { 「 match」:{ 「 gender」:「 Male」 } } ] } } }
查詢上下文和過濾器上下文
默認狀況下,Elasticsearch返回搜索結果時,會根據它們的相關性得分對它們進行排序,這代表文檔與查詢的匹配程度。計算該相關性分數,並將其與每一個結果一塊兒返回到元數據的_score參數中。
默認狀況下,這是一個正浮點數。
對於不一樣類型的查詢,_score計算技術可能有所不一樣。也就是說,「匹配」查詢的得分計算可能與「跨度」查詢的得分計算不一樣。
但最重要的是,分數計算取決於查詢子句運行的上下文。也就是說,查詢子句能夠在「查詢」上下文或「過濾器」上下文中運行。
查詢上下文
在查詢上下文中執行子句時,它將查找「文檔與查詢的匹配程度」。比賽越多,得分越高。htm
以下面的屏幕截圖所示:blog
在上面的示例中,我在「標題」字段中搜索了「導演」。該查詢返回了一些結果,查找結果1,標題與查詢子句(即關鍵字「 Director」和「 of」)徹底匹配。所以,第一份文檔的分數更高,爲7.363
與第二個文檔中同樣,查詢子句中只有一個關鍵詞匹配(第二個文檔中只有「 Director」已經匹配),所以比第一個文檔的得分少(5.305)。
所以,與第二個文檔相比,第一個文檔的匹配度更高,這很明顯地反映在兩個文檔的_score元數據中。
當在查詢上下文中給出查詢子句時,就會發生這種狀況。
篩選條件
當在過濾器上下文中給出查詢子句時,它僅查看文檔是否包含not子句。這其實是對/錯的返回。假設咱們在過濾器上下文中查詢數據,經過詢問文檔字段性別是否匹配「 Male」,咱們將只得到匹配的文檔,而沒有分數。
與查詢上下文不一樣,篩選器上下文不使用時間來計算分數,所以篩選器上下文返回更快的結果。
下圖顯示了涉及按性別過濾的過濾器上下文示例,以下圖所示:
在上面的示例中,您能夠看到在過濾器上下文中應用時,結果文檔的分數返回0。
從新訪問布爾查詢。
考慮到上述狀況,是時候從新討論布爾查詢了。
在布爾查詢中,必須和應節將在查詢上下文中執行,這意味着必須節中的子句將計算分數。
bool查詢中的must_not和should部分在哪裏執行過濾條件中的查詢子句,而且不會影響評分。
爲了演示,讓咱們首先嚐試在must節中使用相同的查詢子句集,而後在must節中應用一個子句,而後在過濾器節中應用一個子句,而後查看分數如何變化。
案例1:「必須」部分中的兩個子句
如您所見,在上面的查詢中,兩個子句都處於相同的必須條件中,而且第一個結果的文檔返回的分數爲2.4333658(在右側面板中)
狀況2:一個子句移到過濾器部分
讓咱們以下移動bool查詢中的filter子句中的gender子句,而後運行查詢。
如今,在右側面板中,看分數,你能夠看到,得分已經降低到1.7261622,這意味着只有在clausein 必須的部分被計算爲得分,並在該條款過濾器部分不用於評分。
爲了確認這一點,咱們只能使用must節子句運行上面的查詢,並查看它是否返回相同的分數。
正如您所預測的那樣,即便從查詢中刪除了filter子句,您也能夠從上面的圖片中看到分數保持不變。
結論在此博客中,咱們剛剛熟悉了Elasticsearch查詢的分類,查詢的上下文以及一些最基本的查詢。在下一個病房博客上,咱們將詳細探討每種查詢類型,並提供更多示例和數據集。