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

2021-03-01 漫話編程

平時使用Elasticsearch的時候,偶爾會在Kibana中使用Query DSL來查詢數據。每次要用到Query DSL時都基本忘光了,需要重新在回顧一遍,最近發現Elasticsearch已經支持SQL查詢了(6.3版本以後),整理了下其用法,希望對大家有所幫助!

簡介

Elasticsearch SQL是一個X-Pack組件,它允許針對Elasticsearch實時執行類似SQL的查詢。無論使用REST接口,命令行還是JDBC,任何客戶端都可以使用SQL對Elasticsearch中的數據進行原生搜索和聚合數據。可以將Elasticsearch SQL看作是一種翻譯器,它可以將SQL翻譯成Query DSL。

Elasticsearch SQL具有如下特性:

原生支持:Elasticsearch SQL是專門為Elasticsearch打造的。沒有額外的零件:無需其他硬體,處理器,運行環境或依賴庫即可查詢Elasticsearch,Elasticsearch SQL直接在Elasticsearch內部運行。輕巧高效:Elasticsearch SQL並未抽象化其搜索功能,相反的它擁抱並接受了SQL來實現全文搜索,以簡潔的方式實時運行全文搜索。學前準備

學習之前我們需要先對Elasticsearch有所了解,並安裝好Elasticsearch和Kibana,這裡安裝的是7.6.2版本。

安裝完成後在Kibana中導入測試數據,數據地址:https://github.com/macrozheng/mall-learning/blob/master/document/json/accounts.json

直接在Kibana的Dev Tools中運行如下命令即可:

第一個SQL查詢

我們使用SQL來查詢下前10條記錄,可以通過format參數控制返回結果的格式,txt表示文本格式,看起來更直觀點,默認為json格式。

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

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

查詢結果顯示如下。

將SQL轉化為DSL

當我們需要使用Query DSL時,也可以先使用SQL來查詢,然後通過Translate API轉換即可。

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

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

最終獲取到Query DSL結果如下。

SQL和DSL混合使用

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

例如查詢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
}

查詢結果展示如下:

SQL和ES對應關係 SQLES描述columnfield資料庫中表的欄位與ES中的屬性對應rowdocument資料庫表中的行記錄與ES中的文檔對應tableindex資料庫中的表與ES中的索引對應常用SQL操作 語法

在ES中使用SQL查詢的語法與在資料庫中使用基本一致,具體格式如下:

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語句設置查詢條件,比如查詢state欄位為VA的記錄,查詢語句如下。

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

查詢結果展示如下:

GROUP BY

我們可以使用GROUP BY語句對數據進行分組,統計出分組記錄數量,最大age和平均balance等信息,查詢語句如下。

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

HAVING

我們可以使用HAVING語句對分組數據進行二次篩選,比如篩選分組記錄數量大於15的信息,查詢語句如下。

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

ORDER BY

我們可以使用ORDER BY語句對數據進行排序,比如按照balance欄位從高到低排序,查詢語句如下。

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

DESCRIBE

我們可以使用DESCRIBE語句查看表(ES中為索引)中有哪些欄位,比如查看account表的欄位,查詢語句如下。

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

SHOW TABLES

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

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

支持的函數

使用SQL查詢ES中的數據,不僅可以使用一些SQL中的函數,還可以使用一些ES中特有的函數。

查詢支持的函數

我們可以使用SHOW FUNCTIONS語句查看所有支持的函數,比如搜索所有帶有DATE欄位的函數可以使用如下語句。

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

全文搜索函數

全文搜索函數是ES中特有的,當使用MATCH或QUERY函數時,會啟用全文搜索功能,SCORE函數可以用來統計搜索評分。

MATCH()

使用MATCH函數查詢address中包含Street的記錄。

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

QUERY()

使用QUERY函數查詢address中包含Street的記錄。

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

SQL CLI

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

使用如下命令啟動SQL CLI:

elasticsearch-sql-cli http://localhost:9200

然後直接輸入SQL命令即可查詢了,注意要加分號。

SELECT account_number,address,age,balance FROM account LIMIT 10;

局限性

使用SQL查詢ES有一定的局限性,沒有原生的Query DSL那麼強大,對於嵌套屬性和某些函數的支持並不怎麼好,但是平時用來查詢下數據基本夠用了。

參考資料

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

相關焦點

  • Elasticsearch SQL用法詳解
    /bin/elasticsearch-plugin install file:/elasticsearch-sql-5.6.3.0.zip3.重啟ES服務 執行完上述三步,你就可以使用SQL探索數據了,以kibana中的使用為例:二、6.4 Elasticsearch SQL用法
  • Elasticsearch 6.3 發布,你們要的 SQL 功能來了
    這個版本最大的亮點莫過於內置支持 SQL 模塊!我在早些時間就說過 Elasticsearch 將會內置支持 SQL,參見:ElasticSearch內置也將支持SQL特性。我們可以像操作 MySQL一樣使用 Elasticsearch,這樣我們就可以減少 DSL 的學習成本,這個 SQL 模塊是屬於 X-Pack 的一部分。
  • 如何用你最熟悉的 SQL 來查詢 Elasticsearch 中的數據?
    針對Elasticsearch專業人員來說,大多數人喜歡使用DSL來進行搜索,但是對於一些不是那麼專業的人員來說,他們更為熟悉的是SQL語句。如何讓他們對Elasticsearch的數據進行查詢是一個問題。藉助Elasticsearch SQL,你可以使用熟悉的查詢語法訪問全文搜索,超快的速度和輕鬆的可伸縮性。
  • Elastic App Search初體驗
    elasticsearch我們選擇的是使用rpm包的安裝方式,elasticsearch-7.9.0-x86_64.rpm,elastic7.9版本已經自帶打包了jdk,無需再獨立安裝jdk。CA,一路回車即可/usr/share/elasticsearch/bin/elasticsearch-certutil ca//然後使用ca進行證書的籤發,生成elastic-certificates.p12,一路回車即可/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
  • Elasticsearch高級調優方法論之——根治慢查詢!
    2.1.1 問題描述集群中的分片太多,以至於任何查詢執行起來都很慢。一個好的經驗法則——確保每個節點的非凍結分片數量保持在:20以下/每GB堆內存。2.1.2 解決方案1、部署之前,設計先行。正如VIVO搜索技術總監振濤兄所說:「集群規劃核心是容量預估,就好比你建個樓,必須規劃好容量,不然說用多少就建多高,吃在地基撐不住!!」。
  • ElasticSearch介紹
    /cn/products/elasticsearchGithub:https://github.com/elastic/elasticsearch總結:1、elasticsearch是一個基於Lucene的高擴展的分布式搜索伺服器,支持開箱即用。
  • Elasticsearch安裝及使用
    在5.x版本中不支持直接安裝head插件,需要單獨啟動一個服務,安裝及啟動步驟如下:執行下載插件命令:git clone git://github.com/mobz/elasticsearch-head.git下載完畢後進入elasticsearch-head目錄,目錄結構如下:執行安裝命令:cd elasticsearch-head
  • ElasticSearch 極簡教程
    Elasticsearch是用Java開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜尋引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。ElasticSearch 架構
  • 在elasticsearch中使用function_score查詢
    前端時間一直在研究kubernets+.net core相關,本打算寫幾篇k8s的文章,但在公司聽到同事遇到個需求一直沒有搞定,於是出於程式設計師的本能了解了一下,就是需要根據左上角,右下角的經緯度坐標查詢一批在地圖上均勻分布!
  • 整合篇:零基礎學習與使用ElasticSearch
    與Apache Solr相比,在Elasticsearch中處理多租戶非常容易。Elasticsearch使用JSON對象作為響應,這使得可以使用不同的程式語言調用Elasticsearch伺服器。Elasticsearch支持幾乎大部分文檔類型,但不支持文本呈現的文檔類型。
  • ElasticSearch安裝
    Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜尋引擎。Elasticsearch用於雲計算[3]中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。
  • Spring Data ElasticSearch 使用
    其主要目標是使得對數據的訪問變得方便快捷,並支持map-reduce框架和雲計算數據服務。Spring Data可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。
  • Elasticsearch(三):實戰
    的核心概念進行比較詳細的介紹,但是在實際生產中我們如何使用elasticsearch呢?本篇文章我們先介紹一些elasticsearch常見的使用方法,然後通過一個實際的例子來加深對elasticsearch使用的理解。這個實際例子是網站上收集的用戶點擊菜單的行為日誌數據存儲在elasticsearch上,並可以通過工具可以通過一些圖表來分析用戶的行為。總體的目標:滿足多個維度圖表的查看,索引可以定期歸檔或者存儲不用人工幹預。
  • Elasticsearch 的快照插件
    插件的安裝與查詢插件可以通過命令行 elasticsearch-plugin 來安裝(官方文檔[1]):sudo bin/elasticsearch-plugin install $plugin_namesudo
  • Linxu安裝ElasticSearch
    Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜尋引擎。Elasticsearch用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在 Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。
  • SpringBoot 操作 ElasticSearch 詳解
    Elasticsearch 是用 Java 語言開發的,並作為 Apache 許可條款下的開放源碼發布,是一種流行的企業級搜尋引擎。ElasticSearch 用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
  • Elastic Search入門:架構說明及Docker方式體驗
    (3)Elastic SearchElastic Search主要做數據和索引的存儲以及相關查詢的計算。(4)KibanaKibana主要是一個數據可視化界面,通過可視化的方式展示ES的計算和索引結果。
  • ElasticSearch聚合實戰+優化
    如果有了具體的聚合結果,生成報表就方便多了,我們可以對不同的聚合結果用不同的樣式展示,如上圖的柱狀圖和折線圖, 用類似 Kibana 和 Grafana 這種工具很方便生成。filter 約束:從根本上講,使用 non-scoring 查詢和使用 match 查詢沒有任何區別。
  • Spring Data Elasticsearch的使用
    =localhost:92002spring.elasticsearch.rest.connection-timeout=6s3spring.elasticsearch.rest.read-timeout=10s4# spring.elasticsearch.rest.password=5# spring.elasticsearch.rest.username=
  • Elasticsearch專題
    Elasticsearch入門(環境搭建)ES是什麼基於Lucene的一個開源的,支持分布式的