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