我的Elasticsearch系列文章,逐漸更新中,歡迎關注
0A.關於Elasticsearch及實例應用
00.Solr與ElasticSearch對比
01.ElasticSearch能做什么?
02.Elastic Stack功能介紹
03.如何安裝與設置Elasticsearch API
04.如果通過elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多個實例和head plugin使用介紹
06.當Elasticsearch進行文檔索引時,它是怎樣工作的?
10.Kibana科普-作為Elasticsearhc開發工具
11.Elasticsearch查詢方法
15.使用Django進行ElasticSearch的簡單方法
16.關於Elasticsearch的6件不太明顯的事情
17.使用Python的初學者Elasticsearch教程
18.用ElasticSearch索引MongoDB,一個簡單的自動完成索引項目
19.Kibana對Elasticsearch的實用介紹
20.不和諧如何索引數十億條消息
21.使用Django進行ElasticSearch的簡單方法
另外Elasticsearch入門,我強烈推薦ElasticSearch新手搭建手冊和這篇優秀的REST API設計指南 給你,這兩個指南都是非常想盡的入門手冊。
在上一個博客中,我們了解了如何將Kibana用作開發工具以及如何使用Kibana加載示例數據。
從這個博客中,我們將研究Elasticsearch的查詢DSL,它非常強大,對於任何Elasticsearch用戶來說都是必不可少的知識領域。
Elasticsearch查詢類型
Elasticsearch中的查詢可以大致分為兩類,
1.葉子查詢
葉子查詢在某些字段中查找特定值。這些查詢可以獨立使用。其中一些查詢包括匹配,條件,范圍查詢。
2.復合查詢
復合查詢使用葉/復合查詢的組合。基本上,它們將多個查詢組合在一起以實現其目標結果。
下圖大致顯示了這兩個查詢的大致分類:
【圖1】
如上圖所示,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查詢組合這些查詢的工具。讓我們討論布爾查詢的一般結構,然后回到問題所在。
布爾查詢的一般結構:
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部分即可,如下所示:
POST employee / _search { “ query”:{ “ bool”:{ “ must”:[ { “ match”:{ “ country”:“ China” } }, { “ range”:{ “ salary”:{ “ gte” :500000 } } } ], “ must_not”:[ { “ match”:{ “ gender”:“ Male” } } ] } } }
查詢上下文和過濾器上下文
默認情況下,Elasticsearch返回搜索結果時,會根據它們的相關性得分對它們進行排序,這表明文檔與查詢的匹配程度。計算該相關性分數,並將其與每個結果一起返回到元數據的_score參數中。
默認情況下,這是一個正浮點數。
對於不同類型的查詢,_score計算技術可能有所不同。也就是說,“匹配”查詢的得分計算可能與“跨度”查詢的得分計算不同。
但最重要的是,分數計算取決於查詢子句運行的上下文。也就是說,查詢子句可以在“查詢”上下文或“過濾器”上下文中運行。
查詢上下文
在查詢上下文中執行子句時,它將查找“文檔與查詢的匹配程度”。比賽越多,得分越高。
如下面的屏幕截圖所示:
【圖2】
在上面的示例中,我在“標題”字段中搜索了“導演”。該查詢返回了一些結果,查找結果1,標題與查詢子句(即關鍵字“ Director”和“ of”)完全匹配。因此,第一份文檔的分數更高,為7.363
與第二個文檔中一樣,查詢子句中只有一個關鍵詞匹配(第二個文檔中只有“ Director”已經匹配),因此比第一個文檔的得分少(5.305)。
因此,與第二個文檔相比,第一個文檔的匹配度更高,這很明顯地反映在兩個文檔的_score元數據中。
當在查詢上下文中給出查詢子句時,就會發生這種情況。
篩選條件
當在過濾器上下文中給出查詢子句時,它僅查看文檔是否包含not子句。這實際上是對/錯的返回。假設我們在過濾器上下文中查詢數據,通過詢問文檔字段性別是否匹配“ Male”,我們將只獲得匹配的文檔,而沒有分數。
與查詢上下文不同,篩選器上下文不使用時間來計算分數,因此篩選器上下文返回更快的結果。
下圖顯示了涉及按性別過濾的過濾器上下文示例,如下圖所示:
【圖3】
在上面的示例中,您可以看到在過濾器上下文中應用時,結果文檔的分數返回0。
重新訪問布爾查詢。
考慮到上述情況,是時候重新討論布爾查詢了。
在布爾查詢中,必須和應節將在查詢上下文中執行,這意味着必須節中的子句將計算分數。
bool查詢中的must_not和should部分在哪里執行過濾條件中的查詢子句,並且不會影響評分。
為了演示,讓我們首先嘗試在must節中使用相同的查詢子句集,然后在must節中應用一個子句,然后在過濾器節中應用一個子句,然后查看分數如何變化。
案例1:“必須”部分中的兩個子句
如您所見,在上面的查詢中,兩個子句都處於相同的必須條件中,並且第一個結果的文檔返回的分數為2.4333658(在右側面板中)
情況2:一個子句移到過濾器部分
讓我們如下移動bool查詢中的filter子句中的gender子句,然后運行查詢。
現在,在右側面板中,看分數,你可以看到,得分已經下降到1.7261622,這意味着只有在clausein 必須的部分被計算為得分,並在該條款過濾器部分不用於評分。
為了確認這一點,我們只能使用must節子句運行上面的查詢,並查看它是否返回相同的分數。
正如您所預測的那樣,即使從查詢中刪除了filter子句,您也可以從上面的圖片中看到分數保持不變。
結論
在此博客中,我們剛剛熟悉了Elasticsearch查詢的分類,查詢的上下文以及一些最基本的查詢。
在下一個病房博客上,我們將詳細探討每種查詢類型,並提供更多示例和數據集。