Elasticsearch查詢及聚合類DSL語(yǔ)句寶典示例詳解
前言
隨著使用es場(chǎng)景的增多,工作當(dāng)中避免不了去使用es進(jìn)行數(shù)據(jù)的存儲(chǔ),在數(shù)據(jù)存儲(chǔ)到es當(dāng)中以后就需要使用DSL語(yǔ)句進(jìn)行數(shù)據(jù)的查詢、聚合等操作,DSL對(duì)SE的意義就像SQL對(duì)MySQL一樣,學(xué)會(huì)如何編寫(xiě)查詢語(yǔ)句決定了后期是否能完全駕馭ES,所以至關(guān)重要,本專題主要是分享常用的DSL語(yǔ)句,拿來(lái)即用。
一、match
如果match 查詢數(shù)字,日期,布爾值或者not_analyzed 的字符串時(shí),會(huì)精確匹配搜索值,不做分詞解析;如果match 查詢?nèi)谋?,?huì)對(duì)查詢?cè)~做分詞解析,然后搜索。
比如對(duì)keyword 類型的tag 查詢,"京東總部"不會(huì)分詞,必須完全相等的詞才會(huì)被搜索出來(lái)
{
"query": {
"match": {
"content" : {
"tag" : "京東總部"
}
}
}
}
比如"寶馬多少馬力"會(huì)被分詞為"寶馬 多少 馬力", 所有有關(guān)"寶馬 多少 馬力", 那么所有包含這三個(gè)詞中的一個(gè)或多個(gè)的文檔就會(huì)被搜索出來(lái)。并且根據(jù)lucene的評(píng)分機(jī)制(TF/IDF)來(lái)進(jìn)行評(píng)分
{
"query": {
"match": {
"content" : {
"query" : "寶馬多少馬力"
}
}
}
}
二、match_phrase
如果想要精確匹配所有同時(shí)包含"寶馬 多少 馬力"的文檔,就要使用 match_phrase 了
{
"query": {
"match_phrase": {
"content" : {
"query" : "寶馬多少馬力"
}
}
}
}
三、mult_match
如果我們希望兩個(gè)字段進(jìn)行匹配,其中一個(gè)字段有這個(gè)文檔就滿足的話,使用multi_match
{
"query": {
"multi_match": {
"query" : "我的寶馬多少馬力",
"fields" : ["title", "content"]
}
}
}
四、term
關(guān)鍵字精確匹配,不分詞解析。注意 term 包含(contains) 操作,而非 等值(equals)判斷。如果文檔包含full_text 及其他詞,也會(huì)命中返回。
使用term要確定的是這個(gè)字段是否“被分析”(analyzed),默認(rèn)的字符串是被分析的。
比如下面的例子,其中的full_text是被分析過(guò)的,所以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!"
}
請(qǐng)求不出數(shù)據(jù)的,因?yàn)閒ull_text分詞后的結(jié)果中沒(méi)有[Quick Foxes!]這個(gè)分詞
GET my_index/my_type/_search
{
"query": {
"term": {
"full_text": "Quick Foxes!"
}
}
}
五、terms
指定多值精確匹配,如果字段包含了指定值中的任何一個(gè)值,那么文檔滿足條件。類似sql中的in
{
"terms": {
"tag": [
"search",
"full_text",
"nosql"
]
}
}
六、range
數(shù)字/時(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 匹配任意,等價(jià)or
•filter 必須匹配:過(guò)濾模式
比如我們想要請(qǐng)求"content 中帶寶馬,但是tag 中不帶寶馬"這樣類似的需求,就需要用到bool 聯(lián)合查詢。
{
"query":{
"bool":{
"must":{
"term":{
"content":"寶馬"
}
},
"must_not":{
"term":{
"tags":"寶馬"
}
}
}
}
}
十、聚合
聚合包含一下兩種:
1、 指標(biāo)聚合(Metric Aggregation):一些數(shù)學(xué)運(yùn)算,可以對(duì)文檔字段進(jìn)行統(tǒng)計(jì)分析
•輸出一個(gè)值
?min
?max
?sum
?avg
? value_count 統(tǒng)計(jì)某字段有值的文檔數(shù)
? cardinality 某字段值去重計(jì)數(shù)
•輸出多個(gè)值
?stats
?percentiles
?percentile_ranks
2、桶聚合(Bucket Aggregation) :一些列滿足特定條件的文檔的集合,相當(dāng)于sql 的groupby
•terms 對(duì)某個(gè)字段統(tǒng)計(jì)每個(gè)不同的內(nèi)容,以及出現(xiàn)文檔的個(gè)數(shù)
•range 某個(gè)范圍內(nèi)文檔的個(gè)數(shù)
默認(rèn)聚合范圍是全文,但是如果有query查詢,那么聚合的范圍就是query查詢的結(jié)果。
value_count 統(tǒng)計(jì)某字段有值的文檔數(shù)
{
"size": 0,
"aggs": {
"count": {
"value_count": {
"field": "companyName"
}
}
}
}
指定查詢語(yǔ)句進(jìn)行統(tǒng)計(jì)
{
"query": {
"term": {
"companyName": "安徽科達(dá)智慧能源科技有限公司"
}
},
"aggs": {
"count": { //自定義名稱
"terms": {
"field": "companyName"
}
}
}
}
以上就是本期分享的DSL語(yǔ)句,小伙伴們結(jié)合自己的使用查詢場(chǎng)景進(jìn)行操練起來(lái)吧。
以上就是Elasticsearch查詢及聚合類DSL語(yǔ)句寶典示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Elasticsearch查詢聚合類DSL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java動(dòng)態(tài)代理機(jī)制詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java動(dòng)態(tài)代理機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot整合EasyExcel實(shí)現(xiàn)導(dǎo)入導(dǎo)出功能
EasyExcel是一個(gè)基于Java的、快速、簡(jiǎn)潔、解決大文件內(nèi)存溢出的Excel處理工具,他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫(xiě)等功能,本文就給大家介紹一下SpringBoot整合EasyExcel實(shí)現(xiàn)導(dǎo)入導(dǎo)出功能的方法,需要的朋友可以參考下2023-09-09
java多態(tài)性中的Overload和Override區(qū)別詳解
這篇文章主要介紹了java多態(tài)性中的Overload和Override區(qū)別詳解,重寫(xiě)(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn),而重載(Overloading)是一個(gè)類中多態(tài)性的一種表現(xiàn),需要的朋友可以參考下2023-07-07

