我的Elasticsearch系列文章,逐漸更新中管挟,歡迎關(guān)注
0A.關(guān)于Elasticsearch及實(shí)例應(yīng)用
03.如何安裝與設(shè)置Elasticsearch API
04.如果通過elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多個(gè)實(shí)例和head plugin使用介紹
06.當(dāng)Elasticsearch進(jìn)行文檔索引時(shí)慨亲,它是怎樣工作的绿鸣?
08.Elasticsearch中的分析和分析器應(yīng)用方式
09.Elasticsearch中構(gòu)建自定義分析器
10.Kibana科普-作為Elasticsearhc開發(fā)工具
另外Elasticsearch入門晋渺,我強(qiáng)烈推薦ElasticSearch搭建小白指南給你,非常想盡的入門指南手冊。
在上一個(gè)博客中稍刀,我們了解了如何將Kibana用作開發(fā)工具以及如何使用Kibana加載示例數(shù)據(jù)。
從這個(gè)博客中敞曹,我們將研究Elasticsearch的查詢DSL账月,它非常強(qiáng)大,對于任何Elasticsearch用戶來說都是必不可少的知識領(lǐng)域澳迫。
Elasticsearch查詢類型
Elasticsearch中的查詢可以大致分為兩類局齿,
1.葉子查詢
葉子查詢在某些字段中查找特定值。這些查詢可以獨(dú)立使用橄登。其中一些查詢包括匹配抓歼,條件,范圍查詢拢锹。
2.復(fù)合查詢
復(fù)合查詢使用葉/復(fù)合查詢的組合谣妻。基本上卒稳,它們將多個(gè)查詢組合在一起以實(shí)現(xiàn)其目標(biāo)結(jié)果蹋半。
下圖大致顯示了這兩個(gè)查詢的大致分類:
如上圖所示,Leaf和化合物分類中仍然有許多類別充坑。在接下來的博客中减江,我們將更詳細(xì)地訪問上圖中的大多數(shù)查詢/查詢類型。
基本查詢樣本
現(xiàn)在捻爷,讓我們熟悉葉子的2個(gè)基本查詢和復(fù)合查詢類型中的一個(gè)查詢以開始操作辈灼。
1.簡單的“匹配”查詢
假設(shè)我們考慮建立索引的文件在以前的博客,讓我們嘗試在球場上“FIRST_NAME”為搜索關(guān)鍵詞“丹尼”的簡單匹配查詢也榄。該查詢將如下所示:
POST employees/_search{“query”:{“match”:{“country”:“China”}}}
上面的查詢將返回給我們所有國家為中國的文件
2.范圍查詢
現(xiàn)在讓我們觸發(fā)另一個(gè)查詢巡莹,這個(gè)查詢也是一個(gè)葉子查詢。該查詢將向我們返回所有薪水大于或等于500,000的員工¢泡海可以使用如下范圍查詢來實(shí)現(xiàn):
POST/_{“ query”:{“ range”:{“ salary”:{“ gte”:500000}}}}
3.布爾查詢
現(xiàn)在來了有趣的部分俐芯。我們?nèi)绾伪容^以上查詢棵介?也就是說钉鸯,我需要所有來自中國但收入超過50萬的員工。
這需要上述兩個(gè)葉查詢的組合∮柿桑現(xiàn)在唠雕,Elasticsearch提供了使用bool查詢組合這些查詢的工具。讓我們討論布爾查詢的一般結(jié)構(gòu)吨述,然后回到問題所在岩睁。
布爾查詢的一般結(jié)構(gòu):
POST _search{“ query”:{“ bool”:{“ must”:[...],“ filter”:[...]揣云,“ must_not”:[...]捕儒,“ should”:[..。]}}}
must:子句(查詢)必須出現(xiàn)在匹配的文檔中邓夕,并將有助于得分刘莹。
filter:子句(查詢)必須出現(xiàn)在匹配的文檔中。但是與查詢分?jǐn)?shù)不同的是焚刚,忽略該分?jǐn)?shù)点弯。
應(yīng)該:子句(查詢)應(yīng)出現(xiàn)在匹配的文檔中。
must_not:子句(查詢)不得出現(xiàn)在匹配的文檔中矿咕。
現(xiàn)在回到我們的問題抢肛,我們的bool查詢旨在重整所有來自中國的雇員并賺取超過500,000的工資,如下所示:
POST employee/_search{“ query”:{“ bool”:{“ must”:[{“ match”:{“ country”:“ China”}}碳柱,{“ range”:{“ salary”:{“ gte” :500000}}}]}}}
現(xiàn)在捡絮,讓我們考慮是否要從列表中篩選出所有男性雇員。我們應(yīng)該做什么莲镣?福稳。只需在上面的查詢中添加條件性別為“ Male”的must_not部分即可,如下所示:
POST employee/_search{“ query”:{“ bool”:{“ must”:[{“ match”:{“ country”:“ China”}}剥悟,{“ range”:{“ salary”:{“ gte” :500000}}}]灵寺,“ must_not”:[{“ match”:{“ gender”:“ Male”}}]}}}
查詢上下文和過濾器上下文
默認(rèn)情況下,Elasticsearch返回搜索結(jié)果時(shí)区岗,會根據(jù)它們的相關(guān)性得分對它們進(jìn)行排序略板,這表明文檔與查詢的匹配程度。計(jì)算該相關(guān)性分?jǐn)?shù)慈缔,并將其與每個(gè)結(jié)果一起返回到元數(shù)據(jù)的_score參數(shù)中叮称。
默認(rèn)情況下,這是一個(gè)正浮點(diǎn)數(shù)。
對于不同類型的查詢瓤檐,_score計(jì)算技術(shù)可能有所不同赂韵。也就是說,“匹配”查詢的得分計(jì)算可能與“跨度”查詢的得分計(jì)算不同挠蛉。
但最重要的是祭示,分?jǐn)?shù)計(jì)算取決于查詢子句運(yùn)行的上下文。也就是說谴古,查詢子句可以在“查詢”上下文或“過濾器”上下文中運(yùn)行质涛。
查詢上下文
在查詢上下文中執(zhí)行子句時(shí),它將查找“文檔與查詢的匹配程度”掰担。比賽越多汇陆,得分越高。
如下面的屏幕截圖所示:
【圖2】
在上面的示例中带饱,我在“標(biāo)題”字段中搜索了“導(dǎo)演”毡代。該查詢返回了一些結(jié)果,查找結(jié)果1勺疼,標(biāo)題與查詢子句(即關(guān)鍵字“ Director”和“ of”)完全匹配教寂。因此,第一份文檔的分?jǐn)?shù)更高恢口,為7.363
與第二個(gè)文檔中一樣孝宗,查詢子句中只有一個(gè)關(guān)鍵詞匹配(第二個(gè)文檔中只有“ Director”已經(jīng)匹配),因此比第一個(gè)文檔的得分少(5.305)耕肩。
因此因妇,與第二個(gè)文檔相比,第一個(gè)文檔的匹配度更高猿诸,這很明顯地反映在兩個(gè)文檔的_score元數(shù)據(jù)中婚被。
當(dāng)在查詢上下文中給出查詢子句時(shí),就會發(fā)生這種情況梳虽。
篩選條件
當(dāng)在過濾器上下文中給出查詢子句時(shí)址芯,它僅查看文檔是否包含not子句。這實(shí)際上是對/錯(cuò)的返回窜觉。假設(shè)我們在過濾器上下文中查詢數(shù)據(jù)谷炸,通過詢問文檔字段性別是否匹配“ Male”,我們將只獲得匹配的文檔禀挫,而沒有分?jǐn)?shù)旬陡。
與查詢上下文不同,篩選器上下文不使用時(shí)間來計(jì)算分?jǐn)?shù)语婴,因此篩選器上下文返回更快的結(jié)果描孟。
下圖顯示了涉及按性別過濾的過濾器上下文示例驶睦,如下圖所示:
【圖3】
在上面的示例中,您可以看到在過濾器上下文中應(yīng)用時(shí)匿醒,結(jié)果文檔的分?jǐn)?shù)返回0场航。
重新訪問布爾查詢。
考慮到上述情況廉羔,是時(shí)候重新討論布爾查詢了溉痢。
在布爾查詢中,必須和應(yīng)節(jié)將在查詢上下文中執(zhí)行蜜另,這意味著必須節(jié)中的子句將計(jì)算分?jǐn)?shù)适室。
bool查詢中的must_not和should部分在哪里執(zhí)行過濾條件中的查詢子句,并且不會影響評分举瑰。
為了演示,讓我們首先嘗試在must節(jié)中使用相同的查詢子句集蔬螟,然后在must節(jié)中應(yīng)用一個(gè)子句此迅,然后在過濾器節(jié)中應(yīng)用一個(gè)子句,然后查看分?jǐn)?shù)如何變化旧巾。
案例1:“必須”部分中的兩個(gè)子句
如您所見耸序,在上面的查詢中,兩個(gè)子句都處于相同的必須條件中鲁猩,并且第一個(gè)結(jié)果的文檔返回的分?jǐn)?shù)為2.4333658(在右側(cè)面板中)
情況2:一個(gè)子句移到過濾器部分
讓我們?nèi)缦乱苿?dòng)bool查詢中的filter子句中的gender子句坎怪,然后運(yùn)行查詢。
現(xiàn)在廓握,在右側(cè)面板中搅窿,看分?jǐn)?shù),你可以看到隙券,得分已經(jīng)下降到1.7261622男应,這意味著只有在clausein 必須的部分被計(jì)算為得分,并在該條款過濾器部分不用于評分娱仔。
為了確認(rèn)這一點(diǎn)沐飘,我們只能使用must節(jié)子句運(yùn)行上面的查詢,并查看它是否返回相同的分?jǐn)?shù)牲迫。
正如您所預(yù)測的那樣耐朴,即使從查詢中刪除了filter子句,您也可以從上面的圖片中看到分?jǐn)?shù)保持不變盹憎。
結(jié)論
在此博客中筛峭,我們剛剛熟悉了Elasticsearch查詢的分類,查詢的上下文以及一些最基本的查詢脚乡。
在下一個(gè)病房博客上蜒滩,我們將詳細(xì)探討每種查詢類型滨达,并提供更多示例和數(shù)據(jù)集。