Elasticsearch官方已支持SQL查詢误续,用起來賊方便吨悍!

平時(shí)使用Elasticsearch的時(shí)候,偶爾會(huì)在Kibana中使用Query DSL來查詢數(shù)據(jù)蹋嵌。每次要用到Query DSL時(shí)都基本忘光了育瓜,需要重新在回顧一遍,最近發(fā)現(xiàn)Elasticsearch已經(jīng)支持SQL查詢了(6.3版本以后)栽烂,整理了下其用法躏仇,希望對(duì)大家有所幫助!

簡(jiǎn)介

Elasticsearch SQL是一個(gè)X-Pack組件愕鼓,它允許針對(duì)Elasticsearch實(shí)時(shí)執(zhí)行類似SQL的查詢钙态。無論使用REST接口,命令行還是JDBC菇晃,任何客戶端都可以使用SQL對(duì)Elasticsearch中的數(shù)據(jù)進(jìn)行原生搜索和聚合數(shù)據(jù)册倒。可以將Elasticsearch SQL看作是一種翻譯器磺送,它可以將SQL翻譯成Query DSL驻子。

Elasticsearch SQL具有如下特性:

  • 原生支持:Elasticsearch SQL是專門為Elasticsearch打造的灿意。
  • 沒有額外的零件:無需其他硬件,處理器崇呵,運(yùn)行環(huán)境或依賴庫即可查詢Elasticsearch缤剧,Elasticsearch SQL直接在Elasticsearch內(nèi)部運(yùn)行。
  • 輕巧高效:Elasticsearch SQL并未抽象化其搜索功能域慷,相反的它擁抱并接受了SQL來實(shí)現(xiàn)全文搜索荒辕,以簡(jiǎn)潔的方式實(shí)時(shí)運(yùn)行全文搜索。

學(xué)前準(zhǔn)備

學(xué)習(xí)之前我們需要先對(duì)Elasticsearch有所了解犹褒,并安裝好Elasticsearch和Kibana抵窒,這里安裝的是7.6.2版本

安裝完成后在Kibana中導(dǎo)入測(cè)試數(shù)據(jù),數(shù)據(jù)地址:https://github.com/macrozheng/mall-learning/blob/master/document/json/accounts.json

直接在Kibana的Dev Tools中運(yùn)行如下命令即可:

image.png

第一個(gè)SQL查詢

我們使用SQL來查詢下前10條記錄叠骑,可以通過format參數(shù)控制返回結(jié)果的格式李皇,txt表示文本格式,看起來更直觀點(diǎn)宙枷,默認(rèn)為json格式掉房。

在Kibana的Console中輸入如下命令:

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account LIMIT 10"
}

查詢結(jié)果顯示如下。
image.png

將SQL轉(zhuǎn)化為DSL

當(dāng)我們需要使用Query DSL時(shí)慰丛,也可以先使用SQL來查詢卓囚,然后通過Translate API轉(zhuǎn)換即可。

例如我們翻譯以下查詢語句:

POST /_sql/translate
{
  "query": "SELECT account_number,address,age,balance FROM account WHERE age>32 LIMIT 10"
}

最終獲取到Query DSL結(jié)果如下诅病。
image.png

SQL和DSL混合使用

我們還可以將SQL和Query DSL混合使用捍岳,比如使用Query DSL來設(shè)置過濾條件。

例如查詢age在30-35之間的記錄睬隶,可以使用如下查詢語句:

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account",
      "filter": {
        "range": {
            "age": {
                "gte" : 30,
                "lte" : 35
            }
        }
    },
    "fetch_size": 10
}

查詢結(jié)果展示如下:
image.png

SQL和ES對(duì)應(yīng)關(guān)系
image.png

常用SQL操作

語法

在ES中使用SQL查詢的語法與在數(shù)據(jù)庫中使用基本一致锣夹,具體格式如下:

SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]

WHERE

可以使用WHERE語句設(shè)置查詢條件,比如查詢state字段為VA的記錄苏潜,查詢語句如下银萍。

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,state FROM account WHERE state='VA' LIMIT 10 "
}

查詢結(jié)果展示如下:
image.png

`GROUP BY

我們可以使用GROUP BY語句對(duì)數(shù)據(jù)進(jìn)行分組,統(tǒng)計(jì)出分組記錄數(shù)量恤左,最大age和平均balance等信息贴唇,查詢語句如下。

POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state LIMIT 10"
}

image.png

HAVING

我們可以使用HAVING語句對(duì)分組數(shù)據(jù)進(jìn)行二次篩選飞袋,比如篩選分組記錄數(shù)量大于15的信息戳气,查詢語句如下。

POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state HAVING COUNT(*)>15 LIMIT 10"
}

image.png

DESCRIBE

我們可以使用DESCRIBE語句查看表(ES中為索引)中有哪些字段巧鸭,比如查看account表的字段瓶您,查詢語句如下。

POST /_sql?format=txt
{
  "query": "DESCRIBE account"
}

image.png

SHOW TABLES

我們可以使用SHOW TABLES查看所有的表(ES中為索引)。

POST /_sql?format=txt
{
  "query": "SHOW TABLES"
}
image.png

支持的函數(shù)

使用SQL查詢ES中的數(shù)據(jù)呀袱,不僅可以使用一些SQL中的函數(shù)贸毕,還可以使用一些ES中特有的函數(shù)。

查詢支持的函數(shù)

我們可以使用SHOW FUNCTIONS語句查看所有支持的函數(shù)夜赵,比如搜索所有帶有DATE字段的函數(shù)可以使用如下語句明棍。

POST /_sql?format=txt
{
  "query": "SHOW FUNCTIONS LIKE '%DATE%'"
}

image.png

全文搜索函數(shù)

全文搜索函數(shù)是ES中特有的,當(dāng)使用MATCHQUERY函數(shù)時(shí)寇僧,會(huì)啟用全文搜索功能摊腋,SCORE函數(shù)可以用來統(tǒng)計(jì)搜索評(píng)分。

MATCH()

使用MATCH函數(shù)查詢address中包含Street的記錄嘁傀。

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE MATCH(address,'Street') LIMIT 10"
}

image.png

QUERY()

使用QUERY函數(shù)查詢address中包含Street的記錄歌豺。

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE QUERY('address:Street') LIMIT 10"
}
image.png

SQL CLI

如果你不想使用Kibana來使用ES SQL的話,也可以使用ES自帶的SQL CLI來查詢心包,該命令位于ES的bin目錄下。

使用如下命令啟動(dòng)SQL CLI:

elasticsearch-sql-cli http://localhost:9200
image.png

然后直接輸入SQL命令即可查詢了馒铃,注意要加分號(hào)蟹腾。

SELECT account_number,address,age,balance FROM account LIMIT 10;
image.png

局限性

使用SQL查詢ES有一定的局限性,沒有原生的Query DSL那么強(qiáng)大区宇,對(duì)于嵌套屬性和某些函數(shù)的支持并不怎么好娃殖,但是平時(shí)用來查詢下數(shù)據(jù)基本夠用了。

參考資料

官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/xpack-sql.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末议谷,一起剝皮案震驚了整個(gè)濱河市炉爆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卧晓,老刑警劉巖芬首,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逼裆,居然都是意外死亡郁稍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門胜宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耀怜,“玉大人,你說我怎么就攤上這事桐愉〔破疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵从诲,是天一觀的道長(zhǎng)左痢。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么抖锥? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任亿眠,我火速辦了婚禮,結(jié)果婚禮上磅废,老公的妹妹穿的比我還像新娘纳像。我一直安慰自己,他們只是感情好拯勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布竟趾。 她就那樣靜靜地躺著,像睡著了一般宫峦。 火紅的嫁衣襯著肌膚如雪岔帽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天导绷,我揣著相機(jī)與錄音犀勒,去河邊找鬼。 笑死妥曲,一個(gè)胖子當(dāng)著我的面吹牛贾费,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檐盟,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼褂萧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了葵萎?” 一聲冷哼從身側(cè)響起导犹,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羡忘,沒想到半個(gè)月后谎痢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卷雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舶得,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽蝴。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沐批,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝎亚,到底是詐尸還是另有隱情九孩,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布发框,位于F島的核電站躺彬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宪拥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一仿野、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧她君,春花似錦脚作、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至校镐,卻和暖如春亿扁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟廓。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工从祝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人引谜。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓牍陌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親煌张。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容