Elasticsearch查詢及聚合類DSL語句寶典示例詳解
前言
隨著使用es場景的增多,工作當(dāng)中避免不了去使用es進(jìn)行數(shù)據(jù)的存儲,在數(shù)據(jù)存儲到es當(dāng)中以后就需要使用DSL語句進(jìn)行數(shù)據(jù)的查詢、聚合等操作,DSL對SE的意義就像SQL對MySQL一樣,學(xué)會如何編寫查詢語句決定了后期是否能完全駕馭ES,所以至關(guān)重要,本專題主要是分享常用的DSL語句,拿來即用。
一、match
如果match 查詢數(shù)字,日期,布爾值或者not_analyzed 的字符串時,會精確匹配搜索值,不做分詞解析;如果match 查詢?nèi)谋?,會對查詢詞做分詞解析,然后搜索。
比如對keyword 類型的tag 查詢,"京東總部"不會分詞,必須完全相等的詞才會被搜索出來
{ "query": { "match": { "content" : { "tag" : "京東總部" } } } }
比如"寶馬多少馬力"會被分詞為"寶馬 多少 馬力", 所有有關(guān)"寶馬 多少 馬力", 那么所有包含這三個詞中的一個或多個的文檔就會被搜索出來。并且根據(jù)lucene的評分機制(TF/IDF)來進(jìn)行評分
{ "query": { "match": { "content" : { "query" : "寶馬多少馬力" } } } }
二、match_phrase
如果想要精確匹配所有同時包含"寶馬 多少 馬力"的文檔,就要使用 match_phrase 了
{ "query": { "match_phrase": { "content" : { "query" : "寶馬多少馬力" } } } }
三、mult_match
如果我們希望兩個字段進(jìn)行匹配,其中一個字段有這個文檔就滿足的話,使用multi_match
{ "query": { "multi_match": { "query" : "我的寶馬多少馬力", "fields" : ["title", "content"] } } }
四、term
關(guān)鍵字精確匹配,不分詞解析。注意 term 包含(contains) 操作,而非 等值(equals)判斷。如果文檔包含full_text 及其他詞,也會命中返回。
使用term要確定的是這個字段是否“被分析”(analyzed),默認(rèn)的字符串是被分析的。
比如下面的例子,其中的full_text是被分析過的,所以full_text的索引中存的就是[quick, foxes],而extra_value中存的是[Quick Foxes!]
PUT my_index { "mappings": { "my_type": { "properties": { "full_text": { "type": "string" }, "exact_value": { "type": "string", "index": "not_analyzed" } } } } } PUT my_index/my_type/1 { "full_text": "Quick Foxes!", "exact_value": "Quick Foxes!" }
請求不出數(shù)據(jù)的,因為full_text分詞后的結(jié)果中沒有[Quick Foxes!]這個分詞
GET my_index/my_type/_search { "query": { "term": { "full_text": "Quick Foxes!" } } }
五、terms
指定多值精確匹配,如果字段包含了指定值中的任何一個值,那么文檔滿足條件。類似sql中的in
{ "terms": { "tag": [ "search", "full_text", "nosql" ] } }
六、range
數(shù)字/時間的區(qū)間查詢,操作符:
•gt > greater than
•gte >=
•lt < litter than
•lte <=
{ "query":{ "range": { "age": { "gte": 20, "lt": 30 } } } }
七、wildcard
通配符索引。* 表示全匹配,? 表示單一匹配。掃描所有倒排索引,性能較差
{ "query": { "wildcard": { "companyName": "*京東*" } } }
八、regexp
正則索引。掃描所有倒排索引,性能較差
{ "query": { "regexp": { "postcode": "W[0-9].+" } } }
九、組合多查詢(bool查詢)
bool 查詢后面可以跟這四種匹配模式
•must 必須匹配
•must_not 必須不匹配
•should 匹配任意,等價or
•filter 必須匹配:過濾模式
比如我們想要請求"content 中帶寶馬,但是tag 中不帶寶馬"這樣類似的需求,就需要用到bool 聯(lián)合查詢。
{ "query":{ "bool":{ "must":{ "term":{ "content":"寶馬" } }, "must_not":{ "term":{ "tags":"寶馬" } } } } }
十、聚合
聚合包含一下兩種:
1、 指標(biāo)聚合(Metric Aggregation):一些數(shù)學(xué)運算,可以對文檔字段進(jìn)行統(tǒng)計分析
•輸出一個值
?min
?max
?sum
?avg
? value_count 統(tǒng)計某字段有值的文檔數(shù)
? cardinality 某字段值去重計數(shù)
•輸出多個值
?stats
?percentiles
?percentile_ranks
2、桶聚合(Bucket Aggregation) :一些列滿足特定條件的文檔的集合,相當(dāng)于sql 的groupby
•terms 對某個字段統(tǒng)計每個不同的內(nèi)容,以及出現(xiàn)文檔的個數(shù)
•range 某個范圍內(nèi)文檔的個數(shù)
默認(rèn)聚合范圍是全文,但是如果有query查詢,那么聚合的范圍就是query查詢的結(jié)果。
value_count 統(tǒng)計某字段有值的文檔數(shù)
{ "size": 0, "aggs": { "count": { "value_count": { "field": "companyName" } } } }
指定查詢語句進(jìn)行統(tǒng)計
{ "query": { "term": { "companyName": "安徽科達(dá)智慧能源科技有限公司" } }, "aggs": { "count": { //自定義名稱 "terms": { "field": "companyName" } } } }
以上就是本期分享的DSL語句,小伙伴們結(jié)合自己的使用查詢場景進(jìn)行操練起來吧。
以上就是Elasticsearch查詢及聚合類DSL語句寶典示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Elasticsearch查詢聚合類DSL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談@mapper引入不到引入的是@MapperScan的問題
這篇文章主要介紹了淺談@mapper引入不到引入的是@MapperScan的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10SpringBoot?調(diào)用外部接口的三種實現(xiàn)方法
Spring Boot調(diào)用外部接口的方式有多種,常見的有以下三種方式:RestTemplate、Feign 和 WebClient,本文就詳細(xì)介紹一下,感興趣的可以了解一下2023-08-08SpringBoot實現(xiàn)優(yōu)雅停機的正確方法
什么叫優(yōu)雅停機?就是向應(yīng)用進(jìn)程發(fā)出停止指令之后,能保證正在執(zhí)行的業(yè)務(wù)操作不受影響,直到操作運行完畢之后再停止服務(wù)。本文就來和大家聊聊SpringBoot實現(xiàn)優(yōu)雅停機的正確姿勢,希望對大家有所幫助2023-01-01Apache Calcite進(jìn)行SQL解析(java代碼實例)
Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過代碼實例給大家介紹Apache Calcite進(jìn)行SQL解析問題,感興趣的朋友一起看看吧2022-01-01