查詢快到起飛的 ES,真的適合你的應(yīng)用場(chǎng)景嗎?
序言
大學(xué)上編程課程,老師都會(huì)先介紹編程思想與編程語(yǔ)言,其中會(huì)著重介紹一下面向過(guò)程編程與面向?qū)ο缶幊?,再延伸到編程語(yǔ)言,如C、Java等;那么當(dāng)下,從個(gè)人認(rèn)知層面來(lái)講,正在處于面向數(shù)據(jù)編程階段,社會(huì)分工越來(lái)越細(xì),編程思想與編程方式已經(jīng)出現(xiàn)了很大的變化。畢業(yè)后走上工作崗位,經(jīng)歷過(guò)很多業(yè)務(wù)項(xiàng)目系統(tǒng)之后,越來(lái)越多的人可能已經(jīng)認(rèn)識(shí)到,需要越來(lái)越重視數(shù)據(jù)產(chǎn)品,應(yīng)用系統(tǒng)核心支撐越來(lái)越依賴數(shù)據(jù)庫(kù)產(chǎn)品,上層的編程語(yǔ)言僅僅是一種交互接口而已;底層的數(shù)據(jù)產(chǎn)品提供的能力,從某種程度上說(shuō),已經(jīng)決定了業(yè)務(wù)系統(tǒng)的支撐能力,交互形式、甚至是編程方式、編程語(yǔ)言等。
Elasticsearch是數(shù)據(jù)產(chǎn)品領(lǐng)域一個(gè)不可替代的多面手,業(yè)務(wù)應(yīng)用范圍非常廣,其最核心的能力是查詢方式豐富,且查詢性能杠杠的。下面就從ES查詢方式的形態(tài)展開,看看它提供的哪些查詢方式可以適配當(dāng)下的業(yè)務(wù)痛點(diǎn)場(chǎng)景。
注:本文內(nèi)容基于ES 7.15.x版本編寫,若是其它版本可能會(huì)存在差異。
一、Query string query
Query string query(簡(jiǎn)稱代號(hào):QS),英語(yǔ)直譯“查詢字符串”就是基于字符串表達(dá)式的一種查詢語(yǔ)法,從當(dāng)前ES版本來(lái)看,雖然已經(jīng)算是比較原始,但也非常具有意義,且有應(yīng)用意義。
QS查詢語(yǔ)法簡(jiǎn)單直接,表達(dá)能力按照人腦最直接的思維方式,有點(diǎn)類似我們的語(yǔ)言對(duì)話的表達(dá)方式,很容易掌握,初學(xué)者稍微有點(diǎn)編程經(jīng)驗(yàn)也會(huì)很快學(xué)會(huì)。從應(yīng)用角度來(lái)說(shuō),非常適合一些需要很強(qiáng)自由度查詢表達(dá)的業(yè)務(wù)場(chǎng)景,且使用這些業(yè)務(wù)系統(tǒng)的人不是非計(jì)算機(jī)專業(yè)的人士。
適用場(chǎng)景舉例,某些物流公司內(nèi)部系統(tǒng)或者電商內(nèi)部業(yè)務(wù)系統(tǒng),數(shù)據(jù)關(guān)聯(lián)字段特別多,幾百個(gè)甚至上千個(gè),業(yè)務(wù)操作人員需要組合任意的條件進(jìn)行查詢,這些業(yè)務(wù)人員并非計(jì)算機(jī)專業(yè)工程師,不可能快速學(xué)會(huì)一些高級(jí)查詢語(yǔ)言的,如SQL,那么QS就顯得非常適合了,其內(nèi)部的簡(jiǎn)單組合條件查詢表達(dá)式,基本上只要稍微有點(diǎn)數(shù)學(xué)邏輯的人,看幾眼就學(xué)會(huì)了。可能有一些IT工程師會(huì)說(shuō),系統(tǒng)設(shè)計(jì)增加一些固定查詢條件不就好了嗎,其實(shí)不然,當(dāng)業(yè)務(wù)系統(tǒng)數(shù)據(jù)字段超過(guò)一定數(shù)量時(shí),系統(tǒng)設(shè)計(jì)開發(fā)仍然采用固定查詢方式,本身就是一種罪過(guò),最后就會(huì)演變IT工程師覺得業(yè)務(wù)需求好多,開發(fā)進(jìn)度跟不上,業(yè)務(wù)操作人員會(huì)任務(wù)業(yè)務(wù)系統(tǒng)設(shè)計(jì)的非常死板,且跟不上業(yè)務(wù)發(fā)展訴求。
可能會(huì)有工程師好奇,為什么不使用關(guān)系型數(shù)據(jù)庫(kù)來(lái)解決,SQL也比較適合此場(chǎng)景的查詢,當(dāng)然這里就屬于另外的話題,需要深入套路RDB與ES底層特性,此處不展開,詳細(xì)可以參考作者之前寫過(guò)的文章,已經(jīng)充分論證。
如下圖,某物流公司內(nèi)部的查詢系統(tǒng),查詢條件已經(jīng)非常多了,依然還不能滿足查詢?cè)V求。
QS雖然查詢方式直接簡(jiǎn)潔,表達(dá)方式非常人性,局限性也很明顯,但不足以支持ES豐富的查詢能力、未來(lái)的新特性、未來(lái)更多的應(yīng)用場(chǎng)景。
建議依然工程師掌握了解,納入腹中,可能某個(gè)業(yè)務(wù)場(chǎng)景就非常適合,可能這個(gè)特性就是某個(gè)業(yè)務(wù)系統(tǒng)核心的技術(shù)支撐,至少我已經(jīng)見識(shí)過(guò)了。
二、Query DSL
DSL 全稱 Query Domain Specific Language,直譯過(guò)來(lái)“領(lǐng)域特定語(yǔ)言”,是ES專門面向ES特性設(shè)計(jì)的一種類抽象語(yǔ)法樹(Abstract Syntax Trees)的查詢語(yǔ)言,查詢表達(dá)能力非常豐富,也是當(dāng)下使用ES的首選,也是任何時(shí)候使用ES的首選。
ES支持了很多種查詢,初步入手ES的工程師可能都會(huì)有深深體會(huì),之前在基于傳統(tǒng)數(shù)據(jù)庫(kù)產(chǎn)品做的非常難解決的查詢問(wèn)題,在ES都非常容易,不僅僅是性能,而是豐富的查詢方式,其實(shí)這也得益于ES設(shè)計(jì)的DSL。
DSL幾乎支持了ES內(nèi)部所有的查詢表達(dá)式能力,其中全文文本分詞查詢(full text query)與詞項(xiàng)精確查詢(term level query)幾乎是最常用的場(chǎng)景;還有一些高級(jí)的查詢特性,在進(jìn)入ES之前,見過(guò)很多工程師在代碼中使用正則或者特別復(fù)雜的邏輯判斷來(lái)替代,實(shí)在UGLY,代碼丑陋,性能也丑陋。
DSL帶來(lái)了豐富的查詢表達(dá)能力,也帶了一定的復(fù)雜度,也是被一些其它數(shù)據(jù)產(chǎn)品領(lǐng)域的工程師所抨擊的地方,特別是SQL領(lǐng)域。本人認(rèn)為這個(gè)是不正確的認(rèn)知,相反,本人認(rèn)為任何數(shù)據(jù)庫(kù)產(chǎn)品都有自己的獨(dú)特性,其獨(dú)特的內(nèi)部實(shí)現(xiàn)與應(yīng)用場(chǎng)景,決定了它的能力,DSL由于其豐富的查詢表達(dá)能力,需要稍微系統(tǒng)的學(xué)習(xí)一下,反而帶來(lái)了比SQL更好的查詢體驗(yàn);在數(shù)據(jù)產(chǎn)品領(lǐng)域還有很多各自產(chǎn)品的DSL,如圖數(shù)據(jù)產(chǎn)品Arrangodb、Cassandra等,正式由于他們的產(chǎn)品獨(dú)特性,其表達(dá)方式已經(jīng)驗(yàn)證了不能完全由SQL替代。
建議,千萬(wàn)不要因?yàn)镾QL與DSL之爭(zhēng)問(wèn)題而錯(cuò)過(guò)了Elasticsearch,其帶給你的便利性,誰(shuí)用誰(shuí)知道。
三、SQL
SQL 全稱 Structured Query Language,直譯過(guò)來(lái)“結(jié)構(gòu)化查詢語(yǔ)言“,這個(gè)不用多說(shuō),廣大的工程師入行編程時(shí),必學(xué)的查詢語(yǔ)法,在之前主要是在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)上使用,不過(guò)隨著NOSQL越來(lái)越得人心,NOSQL也開始逐步集成此特性,因?yàn)閺V大的群組基礎(chǔ),業(yè)界俗語(yǔ)“大數(shù)據(jù)BI工程師就是SQL工程師“,每日的工作就是寫SQL。
Elasticsearch官方自 6.5.x 版本開始集成自家SQL查詢方式,在此之前一般會(huì)采用NLPChina提供插件,全稱Elasticsearch-sql,帶來(lái)了一定的便利性,但其本質(zhì)上是將SQL表達(dá)式直接轉(zhuǎn)換為DSL表達(dá)式查詢,僅僅多了一次轉(zhuǎn)換,并未有什么革命性的變化。但不可否認(rèn)其在IT工程師的業(yè)務(wù)應(yīng)用訴求。
曾在某物流公司見過(guò)業(yè)務(wù)部門系統(tǒng)架構(gòu)師,將SQL的復(fù)雜表達(dá)能力應(yīng)用到極致,用來(lái)解決數(shù)據(jù)與用戶權(quán)限方面的通用性表達(dá)語(yǔ)言,本人見過(guò)最強(qiáng)大復(fù)雜的權(quán)限系統(tǒng),也覺得設(shè)計(jì)的非常優(yōu)秀的;從事過(guò)業(yè)務(wù)系統(tǒng)的工程師可能都會(huì)有同感,常規(guī)的業(yè)務(wù)系統(tǒng)都需要一個(gè)權(quán)限系統(tǒng),用來(lái)隔離用戶與數(shù)據(jù)方面的訪問(wèn)權(quán)限,需要精確到數(shù)據(jù)行,數(shù)據(jù)字段等層面,而且還需要支持很多定制化場(chǎng)景,如就指定某些人某個(gè)時(shí)間點(diǎn)可訪問(wèn)等;該系統(tǒng)的核心關(guān)鍵設(shè)計(jì)就是基于SQL來(lái)完成,無(wú)論多么復(fù)雜個(gè)性化的權(quán)限隔離需求,都只要轉(zhuǎn)換為SQL表達(dá)式來(lái)執(zhí)行而已,一招輕松化解;當(dāng)然也應(yīng)用了Elasticsearch,想象一下,如果沒(méi)有提供SQL支持,那么業(yè)務(wù)系統(tǒng)的變態(tài)權(quán)限隔離需求,又該如何設(shè)計(jì)完成呢?
官方SQL相比社區(qū)做了更多的創(chuàng)新,其中有一點(diǎn),本人是特別推薦的,基于官方SQL執(zhí)行查詢,返回結(jié)果數(shù)據(jù)量同比DSL查詢要減少近一倍;官方SQL支持多種數(shù)據(jù)格式查詢結(jié)果,其中Json是最常用,也是REST API時(shí)代,廣大程序員們最熱衷的數(shù)據(jù)交互接口協(xié)議。這對(duì)于應(yīng)用ES執(zhí)行查詢后需要返回大量數(shù)據(jù)結(jié)果場(chǎng)景非常好,大大減輕網(wǎng)絡(luò)流量IO,也是一個(gè)性能優(yōu)化點(diǎn)。
官方SQL同時(shí)為了兼容DSL,也提供了轉(zhuǎn)換DSL的API,如果對(duì)于DSL不太熟悉,可以借助此能力。
官方SQL給帶來(lái)很多優(yōu)越的便利性,也存在一些局限性,并不完整支持標(biāo)準(zhǔn)的SQL,與當(dāng)下最新的SQL兼容,很多查詢特性還是有明顯的DSL影子;官方SQL持續(xù)演進(jìn),從最早6.5.x到現(xiàn)在7.15.x,已經(jīng)增加了很多SQL標(biāo)準(zhǔn)支持,但是SQL不能替代DSL,至今DSL依然是ES領(lǐng)域最好的查詢方式,這一點(diǎn)必須要明確。
四、EQL
EQL 全稱 Event Query Language ,直譯過(guò)來(lái)“直接查詢語(yǔ)言”,核心需要基于時(shí)序數(shù)據(jù),必須要指定時(shí)間字段與類別字段,如日志,指標(biāo)、全鏈路等場(chǎng)景,ES官方推出此查詢方式主要目的是安全分析場(chǎng)景。
EQL目前并未在應(yīng)用系統(tǒng)中非常大規(guī)模使用,介紹見到工程師使用,可能是其定位在安全分析場(chǎng)景原因。必須承認(rèn)其帶來(lái)的一些查詢特性,其語(yǔ)法非常直觀,表達(dá)式也非常豐富,對(duì)于有編程基礎(chǔ)的工程師,非常容易掌握,必須強(qiáng)調(diào),這是一個(gè)面向安全行業(yè)的設(shè)計(jì)的查詢語(yǔ)言,所以運(yùn)用其最多的應(yīng)該也是安全方面的工程師。
五、ES查詢方式內(nèi)部
到目前為止,ES主要提供了以上4種查詢方向,也分別按照以上順序演進(jìn),還不存在誰(shuí)替代誰(shuí),依然保持并行獨(dú)立發(fā)展進(jìn)化。ES執(zhí)行所有的查詢方式,先是轉(zhuǎn)換為DSL,構(gòu)建各自的QueryBuilder,其次構(gòu)建各自的Query,最后交由Lucene執(zhí)行。
六、經(jīng)驗(yàn)認(rèn)知
以上基于ES提供的查詢方式,詳細(xì)談了一下個(gè)人的經(jīng)驗(yàn)認(rèn)知,僅僅在ES領(lǐng)域,就可以看到,如果我們深度的掌握ES數(shù)據(jù)產(chǎn)品,我們的工作方式與編程方式都會(huì)發(fā)生很大的變化,我們不再需要基于編程語(yǔ)言去構(gòu)建復(fù)雜的原始查詢業(yè)務(wù)場(chǎng)景,不在需要編程語(yǔ)言承載數(shù)據(jù)表達(dá)能力。
在面向數(shù)據(jù)編程時(shí)代,我們的編程方式與認(rèn)知都需要進(jìn)化,掌握一門編程語(yǔ)言僅僅是能做應(yīng)用項(xiàng)目的第一步,編程語(yǔ)言掌握的深入其實(shí)本質(zhì)上沒(méi)有太多意義,一個(gè)應(yīng)用系統(tǒng)最終需要的是數(shù)據(jù)產(chǎn)品來(lái)承載,編程語(yǔ)言僅僅是一個(gè)交互入口,我們可以在很短的時(shí)間內(nèi)學(xué)會(huì)一門編程語(yǔ)言并進(jìn)行項(xiàng)目實(shí)戰(zhàn),但是對(duì)于一個(gè)數(shù)據(jù)產(chǎn)品的掌控確需要相當(dāng)長(zhǎng)的時(shí)間與經(jīng)驗(yàn)積累。
“ES玩的好,下班下得早!”不僅僅是一句ES的口號(hào),更多的是期望通過(guò)“面向數(shù)據(jù)編程”理念,重新審視編程的本質(zhì)。
參考資料
- 查詢字符串 query string
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
- 簡(jiǎn)單查詢字符串 simple-query-string
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
- 查詢領(lǐng)域特定語(yǔ)言 query-dsl
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
- SQL社區(qū)插件 elasticsearch-sql
- https://github.com/NLPchina/elasticsearch-sql
- SQL官方插件 xpack-sql
- https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html
- 官方EQL
- https://www.elastic.co/guide/en/elasticsearch/reference/current/eql.html
作者介紹
李猛,數(shù)據(jù)領(lǐng)域?qū)<遥珽lastic Stack國(guó)內(nèi)頂尖實(shí)戰(zhàn)專家,國(guó)內(nèi)首批Elastic官方認(rèn)證工程師21人之一。2012年入手Elasticsearch,對(duì)Elastic Stack技術(shù)棧開發(fā)、架構(gòu)、運(yùn)維、源碼、算法等方面有深入實(shí)戰(zhàn)經(jīng)驗(yàn)。負(fù)責(zé)過(guò)多種Elastic Stack項(xiàng)目,包括大數(shù)據(jù)分析領(lǐng)域、機(jī)器學(xué)習(xí)預(yù)測(cè)領(lǐng)域、業(yè)務(wù)查詢加速領(lǐng)域、日志分析領(lǐng)域、基礎(chǔ)指標(biāo)監(jiān)控領(lǐng)域等。十余年技術(shù)實(shí)戰(zhàn)從業(yè)經(jīng)驗(yàn),擅長(zhǎng)大數(shù)據(jù)多種技術(shù)?;旌希到y(tǒng)架構(gòu)領(lǐng)域。