一、前言
工作中遇到ES的查詢問題,由于業(yè)務(wù)方給的條件不清晰,有些查詢無法實(shí)現(xiàn),需要用到DSL語法查詢實(shí)現(xiàn),很久沒用生疏了,借此機(jī)會復(fù)習(xí)下。
二、定義
1.基本介紹
Elasticsearch(簡稱為ES),一個(gè)開源的分布式搜索和分析引擎,主要用于處理大量數(shù)據(jù)并提供快速、實(shí)時(shí)的搜索功能。
DSL(Domain Specific Language),一種特定領(lǐng)域的查詢語言,用于構(gòu)建復(fù)雜的查詢和聚合操作。
在Elasticsearch中,可用DSL語法來定義查詢和過濾條件,以及執(zhí)行聚合操作。
DSL語法具有JSON格式****(敲重點(diǎn),要考),因此它非常易于閱讀和編寫。
2.語法說明
(1)關(guān)鍵字(Keywords)
- DSL通常會定義一組關(guān)鍵字,這些關(guān)鍵字具有特殊含義,并在DSL中起到關(guān)鍵作用。關(guān)鍵字通常不能用作標(biāo)識符或變量名。
- 示例:在一個(gè)簡單的數(shù)學(xué)表達(dá)式DSL中,可能會定義關(guān)鍵字如"add"、"subtract"等來表示加法和減法操作。
(2)標(biāo)識符(Identifiers)
- 標(biāo)識符是用來表示變量名、函數(shù)名或其他用戶定義的名稱。它們需要遵循特定的命名規(guī)則,如大小寫敏感、不包含特殊字符等。
- 示例:在一個(gè)配置文件DSL中,可以使用標(biāo)識符來表示不同的配置項(xiàng),如"username"、"password"等。
(3)表達(dá)式(Expressions)
- 表達(dá)式是DSL中最基本的構(gòu)建塊,用于計(jì)算或產(chǎn)生某個(gè)值。表達(dá)式可以包括變量、常量、運(yùn)算符和函數(shù)調(diào)用。
- 示例:在一個(gè)數(shù)學(xué)表達(dá)式DSL中,可以將"2 + 3"作為一個(gè)表達(dá)式,計(jì)算結(jié)果為5。
(4)運(yùn)算符(Operators)
- 運(yùn)算符用于執(zhí)行各種操作,例如算術(shù)運(yùn)算、邏輯運(yùn)算、比較運(yùn)算等。DSL中的運(yùn)算符根據(jù)所涉及的領(lǐng)域和需求而定。
- 示例:在一個(gè)布爾表達(dá)式DSL中,可以定義邏輯運(yùn)算符如"and"、"or"用于連接多個(gè)條件。
(5)函數(shù)調(diào)用(Function Calls)
- DSL可以支持函數(shù)調(diào)用,允許用戶使用預(yù)定義或自定義的函數(shù)來完成特定的任務(wù)。函數(shù)調(diào)用通常由函數(shù)名稱和傳遞給函數(shù)的參數(shù)組成。
- 示例:在一個(gè)日期處理DSL中,可以定義函數(shù)"formatDate(date, format)",其中"date"是日期值,"format"是日期格式字符串。
(6)控制流(Control Flow)
- 控制流語句用于控制程序的執(zhí)行流程,例如條件語句(if-else)和循環(huán)語句(while、for)等。DSL可以支持特定的控制流語句來滿足領(lǐng)域特定需求。
- 示例:在一個(gè)工作流程DSL中,可以使用條件語句來判斷某個(gè)條件是否滿足并執(zhí)行相應(yīng)的操作。
(7)注釋(Comments)
- 注釋用于向DSL代碼添加說明性文本,以便開發(fā)人員理解和維護(hù)代碼。注釋通常不會被編譯或執(zhí)行,僅用于閱讀目的。
- 示例:在DSL中,可以使用雙斜杠(//)或特定的注釋標(biāo)記來添加注釋,如:“// 這是一個(gè)示例注釋”。
3.常見語法
(1)查詢(Query)
用于指定搜索條件,并返回與之匹配的文檔結(jié)果集。以下是一些常見的查詢類型:
- Match查詢:用于根據(jù)指定字段的內(nèi)容進(jìn)行全文匹配。
- Term查詢:用于精確匹配某個(gè)字段的值,不進(jìn)行分詞。
- Range查詢:用于匹配某個(gè)范圍內(nèi)的值。
- Bool查詢:用于組合多個(gè)查詢條件。
(2)過濾(Filter)
用于篩選滿足指定條件的文檔結(jié)果集。過濾器通常用于在查詢結(jié)果上應(yīng)用額外的限制。以下是一些常見的過濾器類型:
- Term過濾器:用于精確匹配某個(gè)字段的值。
- Range過濾器:用于篩選符合某個(gè)范圍條件的值。
- Bool過濾器:用于組合多個(gè)過濾條件。
(3)聚合(Aggregation)
用于對文檔結(jié)果集進(jìn)行分組和統(tǒng)計(jì)操作,從而生成各種匯總數(shù)據(jù)。聚合可以計(jì)算平均值、總和、最大值、最小值等。以下是一些常見的聚合類型:
- Terms聚合:根據(jù)指定字段的值進(jìn)行分組,并返回每個(gè)分組的文檔統(tǒng)計(jì)信息。
- Date Histogram聚合:按照時(shí)間間隔對文檔進(jìn)行分組,并返回每個(gè)時(shí)間間隔的文檔統(tǒng)計(jì)信息。
- Range聚合:將文檔分組到不同的范圍,并返回每個(gè)范圍的文檔統(tǒng)計(jì)信息。
三、示例枚舉
1.單獨(dú)查詢
我用的ES版本為7.1.0,以下所有示例均基于這個(gè)版本,不同版本在寫法上略有差異,使用時(shí)要注意喔。
(1)基本查詢(Match Query)
- 查詢指定字段中匹配關(guān)鍵詞或短語的文檔。
- 示例:查詢"title"字段包含"Elasticsearch"的文檔。
GET /index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
(2)多字段查詢(Multi-match Query)
- 在多個(gè)字段中匹配指定的關(guān)鍵詞或短語。
- 示例:在"title"和"content"字段中匹配"Elasticsearch"的文檔。
GET /index/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["title", "content"]
}
}
}
(3)范圍查詢(Range Query)
- 根據(jù)范圍條件匹配字段中的值。
- 示例:查詢價(jià)格在50到100之間的文檔。
GET /index/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
}
(4)布爾查詢(Bool Query)
- 將多個(gè)查詢組合為邏輯上的AND、OR或NOT關(guān)系。
- 示例:查詢標(biāo)題包含"Elasticsearch"且價(jià)格大于等于50的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "range": { "price": { "gte": 50 } } }
]
}
}
}
(5)聚合查詢(Aggregation Query)
- 計(jì)算和統(tǒng)計(jì)數(shù)據(jù)集中的匯總信息。
- 示例:計(jì)算字段"sales"的總和作為結(jié)果返回。
GET /index/_search
{
"aggs": {
"total_sales": {
"sum": { "field": "sales" }
}
}
}
(6)排序(Sorting)
- 對搜索結(jié)果按照指定字段進(jìn)行排序。
- 示例:按照"timestamp"字段的降序?qū)Y(jié)果進(jìn)行排序。
GET /index/_search
{
"sort": [
{ "timestamp": { "order": "desc" } }
]
}
(7)分頁(Pagination)
- 從搜索結(jié)果中獲取特定范圍的文檔。
- 示例:返回從0開始的10個(gè)文檔作為結(jié)果。
GET /index/_search
{
"from": 0,
"size": 10,
"query": {
"match_all": {}
}
}
2.組合查詢
因?yàn)榇蟛糠秩粘J褂?,都是組合查詢,所以在此也羅列一些組合查詢的示例。
(1)組合多個(gè)must查詢
- 示例:要求標(biāo)題包含"Elasticsearch"且內(nèi)容包含"數(shù)據(jù)分析"的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "數(shù)據(jù)分析" } }
]
}
}
}
(2)組合must和should查詢
- 示例:要求標(biāo)題包含"Elasticsearch"且(價(jià)格大于等于50或評分高于4)的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
]
}
}
}
(3)組合must和must_not查詢
- 示例:要求標(biāo)題包含"Elasticsearch"且不包含"教程"的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"must_not": [
{ "match": { "title": "教程" } }
]
}
}
}
(4)組合多個(gè)should查詢
- 示例:要求標(biāo)題包含"Elasticsearch"或內(nèi)容包含"數(shù)據(jù)分析"或作者是"John"的文檔。
GET /index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "數(shù)據(jù)分析" } },
{ "match": { "author": "John" } }
]
}
}
}
(5)嵌套組合查詢
- 示例:要求標(biāo)題包含"Elasticsearch"且(價(jià)格大于等于50或評分高于4)且(內(nèi)容包含"搜索引擎"或標(biāo)簽是"技術(shù)")的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
],
"minimum_should_match": 1,
"filter": [
{ "match": { "content": "搜索引擎" } },
{ "terms": { "tags": ["技術(shù)"] } }
]
}
}
}
- 將多個(gè)查詢組合使用bool查詢的must、should或must_not子句。
- 示例:查詢標(biāo)題包含"Elasticsearch"且(價(jià)格大于等于50或評分高于4)的文檔。
GET /index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{
"bool": {
"should": [
{ "range": { "price": { "gte": 50 } } },
{ "range": { "rating": { "gt": 4 } } }
]
}
}
]
}
}
}
四、總結(jié)
對技術(shù)的態(tài)度還是那句話:只有不斷學(xué)習(xí)才能不斷進(jìn)步,在此也推薦一些關(guān)于ES+DSL的主題文章,可以參考學(xué)習(xí):文章來源:http://www.zghlxwxcb.cn/news/detail-529303.html
- “Getting Started with Elasticsearch: A Complete Guide” by Elastic:這篇文章是Elastic官方提供的入門指南,涵蓋了Elasticsearch的基本概念、安裝和配置,以及常見的用例和查詢示例。
- “Introduction to Domain-Specific Languages” by Martin Fowler:這是Martin Fowler撰寫的一篇關(guān)于領(lǐng)域特定語言的介紹性文章。它解釋了什么是DSL,為什么使用DSL以及如何設(shè)計(jì)和實(shí)現(xiàn)DSL。
- “Creating Domain-Specific Languages with Xtext” by Lars Vogel:這篇文章介紹了使用Xtext開發(fā)領(lǐng)域特定語言的方法。它探討了Xtext的基本概念、工作流程和示例,幫助您開始構(gòu)建自己的DSL。
- “Building Domain-Specific Languages in Python” by Andrew Dalke:這篇文章介紹了在Python中構(gòu)建領(lǐng)域特定語言的方法。它包含了一些庫和工具的示例,可以幫助您在Python項(xiàng)目中實(shí)現(xiàn)自定義DSL。
以上是梳理總結(jié)的一些關(guān)于ES+DSL 查詢語法學(xué)習(xí)的內(nèi)容,希望能幫到大家, 如有錯(cuò)誤,歡迎指正。
原創(chuàng)不易,轉(zhuǎn)載請注意出處:
https://blog.csdn.net/weixin_41613094/article/details/131578855文章來源地址http://www.zghlxwxcb.cn/news/detail-529303.html
到了這里,關(guān)于【DSL】ES+DSL 查詢語法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!