最近發佈的 Elasticsearch 6.3 包含了你們期待已久的 SQL 特性,今天給你們介紹一下具體的使用方法。html
目前支持的 SQL 只能進行數據的查詢只讀操做,不能進行數據的修改,因此咱們的數據插入仍是要走以前的常規索引接口。mysql
目前 Elasticsearch 的支持 SQL 命令只有如下幾個:sql
命令 | 說明 |
---|---|
DESC table | 用來描述索引的字段屬性 |
SHOW COLUMNS | 功能同上,只是別名 |
SHOW FUNCTIONS | 列出支持的函數列表,支持通配符?過濾 |
SHOW TABLES | 返回索引列表 |
SELECT .. FROM table_name WHERE .. GROUP BY .. HAVING .. ORDER BY .. LIMIT .. | 用來執行查詢的命令 |
咱們分別來看一下各自怎麼用,以及有什麼效果吧,本身也能夠動手試一下,看看。數據庫
首先,咱們建立一條數據:apache
POST twitter/doc/ { "name":"medcl", "twitter":"sql is awesome", "date":"2018-07-27", "id":123 }
在 ES 裏面執行 SQL 語句,有三種方式,第一種是 RESTful 方式,第二種是 SQL-CLI 命令行工具,第三種是經過 JDBC 來鏈接 ES,執行的 SQL 語句其實都同樣,咱們先以 RESTful 方式來講明用法。服務器
RESTful 的語法以下:ssh
POST /_xpack/sql?format=txt { "query": "SELECT * FROM twitter" }
由於 SQL 特性是 xpack 的免費功能,因此是在 _xpack
這個路徑下面,咱們只須要把 SQL 語句傳給 query 字段就好了,注意最後面不要加上 ;
結尾,注意是不要!elasticsearch
咱們執行上面的語句,查詢返回的結果以下:ide
date | id | name | twitter ------------------------+---------------+---------------+--------------- 2018-07-27T00:00:00.000Z|123 |medcl |sql is awesome
ES 儼然已經變成 SQL 數據庫了,咱們再看看如何獲取全部的索引列表:函數
POST /_xpack/sql?format=txt { "query": "SHOW tables" }
返回以下:
name | type ---------------------------------+--------------- .kibana |BASE TABLE .monitoring-alerts-6 |BASE TABLE .monitoring-es-6-2018.06.21 |BASE TABLE .monitoring-es-6-2018.06.26 |BASE TABLE .monitoring-es-6-2018.06.27 |BASE TABLE .monitoring-kibana-6-2018.06.21 |BASE TABLE .monitoring-kibana-6-2018.06.26 |BASE TABLE .monitoring-kibana-6-2018.06.27 |BASE TABLE .monitoring-logstash-6-2018.06.20|BASE TABLE .reporting-2018.06.24 |BASE TABLE .triggered_watches |BASE TABLE .watcher-history-7-2018.06.20 |BASE TABLE .watcher-history-7-2018.06.21 |BASE TABLE .watcher-history-7-2018.06.26 |BASE TABLE .watcher-history-7-2018.06.27 |BASE TABLE .watches |BASE TABLE apache_elastic_example |BASE TABLE forum-mysql |BASE TABLE twitter
有點多,咱們能夠按名稱過濾,如 twitt 開頭的索引,注意通配符只支持 %
和 _
,分別表示多個和單個字符(什麼,不記得了,回去翻數據庫的書去!):
POST /_xpack/sql?format=txt { "query": "SHOW TABLES 'twit%'" } POST /_xpack/sql?format=txt { "query": "SHOW TABLES 'twitte_'" }
上面返回的結果都是:
name | type ---------------+--------------- twitter |BASE TABLE
若是要查看該索引的字段和元數據,以下:
POST /_xpack/sql?format=txt { "query": "DESC twitter" }
返回:
column | type ---------------+--------------- date |TIMESTAMP id |BIGINT name |VARCHAR name.keyword |VARCHAR twitter |VARCHAR twitter.keyword|VARCHAR
都是動態生成的字段,包含了 .keyword 字段。 還能使用下面的命令來查看,主要是兼容 SQL 語法。
POST /_xpack/sql?format=txt { "query": "SHOW COLUMNS IN twitter" }
另外,若是不記得 ES 支持哪些函數,只須要執行下面的命令,便可獲得完整列表:
SHOW FUNCTIONS
返回結果以下,也就是當前6.3版本支持的全部函數,以下:
name | type ----------------+--------------- AVG |AGGREGATE COUNT |AGGREGATE MAX |AGGREGATE MIN |AGGREGATE SUM |AGGREGATE STDDEV_POP |AGGREGATE VAR_POP |AGGREGATE PERCENTILE |AGGREGATE PERCENTILE_RANK |AGGREGATE SUM_OF_SQUARES |AGGREGATE SKEWNESS |AGGREGATE KURTOSIS |AGGREGATE DAY_OF_MONTH |SCALAR DAY |SCALAR DOM |SCALAR DAY_OF_WEEK |SCALAR DOW |SCALAR DAY_OF_YEAR |SCALAR DOY |SCALAR HOUR_OF_DAY |SCALAR HOUR |SCALAR MINUTE_OF_DAY |SCALAR MINUTE_OF_HOUR |SCALAR MINUTE |SCALAR SECOND_OF_MINUTE|SCALAR SECOND |SCALAR MONTH_OF_YEAR |SCALAR MONTH |SCALAR YEAR |SCALAR WEEK_OF_YEAR |SCALAR WEEK |SCALAR ABS |SCALAR ACOS |SCALAR ASIN |SCALAR ATAN |SCALAR ATAN2 |SCALAR CBRT |SCALAR CEIL |SCALAR CEILING |SCALAR COS |SCALAR COSH |SCALAR COT |SCALAR DEGREES |SCALAR E |SCALAR EXP |SCALAR EXPM1 |SCALAR FLOOR |SCALAR LOG |SCALAR LOG10 |SCALAR MOD |SCALAR PI |SCALAR POWER |SCALAR RADIANS |SCALAR RANDOM |SCALAR RAND |SCALAR ROUND |SCALAR SIGN |SCALAR SIGNUM |SCALAR SIN |SCALAR SINH |SCALAR SQRT |SCALAR TAN |SCALAR SCORE |SCORE
一樣支持通配符進行過濾:
POST /_xpack/sql?format=txt { "query": "SHOW FUNCTIONS 'S__'" }
結果:
name | type ---------------+--------------- SUM |AGGREGATE SIN |SCALAR
那若是要進行模糊搜索呢,Elasticsearch 的搜索能力你們都知道,強!在 SQL 裏面,能夠用 match 關鍵字來寫,以下:
POST /_xpack/sql?format=txt { "query": "SELECT SCORE(), * FROM twitter WHERE match(twitter, 'sql is') ORDER BY id DESC" }
最後,還能試試 SELECT 裏面的一些其餘操做,如過濾,別名,以下:
POST /_xpack/sql?format=txt { "query": "SELECT SCORE() as score,name as myname FROM twitter as mytable where name = 'medcl' OR name ='elastic' limit 5" }
結果以下:
score | myname ---------------+--------------- 0.2876821 |medcl
或是分組和函數計算:
POST /_xpack/sql?format=txt { "query": "SELECT name,max(id) as max_id FROM twitter as mytable group by name limit 5" }
結果以下:
name | max_id ---------------+--------------- medcl |123.0
上面的例子基本上把 SQL 的基本命令都介紹了一遍,不少狀況下,用 RESTful 可能不是很方便,那麼能夠試試用 CLI 命令行工具來執行 SQL 語句,妥妥的 SQL 操做體驗。
切換到命令行下,啓動 cli 程序便可進入命令行交互提示界面,以下:
➜ elasticsearch-6.3.0 ./bin/elasticsearch-sql-cli .sssssss.` .sssssss. .:sXXXXXXXXXXo` `ohXXXXXXXXXho. .yXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXX- .XXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXo. .oXXXXXXXXXXXXXXXXXXXXh .XXXXXXXXXXXXXXXXXXXXXXo``oXXXXXXXXXXXXXXXXXXXXXXy `yXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXo` .XXXXXXXXXXXXXXXXXXXXXXXXXo` .oXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXo` `odo` `oXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXo` `yXXXXXXXXXXXXXXXXXXXXXXXo` oXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXXXy .XXXXXXXXXXXXXXXXXXXXo` /XXXXXXXXXXXXXXXXXXXXX .XXXXXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXXXX- -XXXXXXXXXXXXXXXo` `oXXXXXXXXXXXXXXXo` .oXXXXXXXXXXXo` `oXXXXXXXXXXXo. `.sshXXyso` SQL `.sshXhss.` sql>
當你看到一個碩大的創口貼,表示 SQL 命令行已經準備就緒了,查看一下索引列表,不,數據表的列表:
[attach]2546[/attach]
各類操做妥妥的,上面已經測試過的命令就不在這裏重複了,只是體驗不同罷了。
若是要鏈接遠程的 ES 服務器,只須要啓動命令行工具的時候,指定服務器地址,若是有加密,指定 keystone 文件,完整的幫助以下:
➜ elasticsearch-6.3.0 ./bin/elasticsearch-sql-cli --help Elasticsearch SQL CLI Non-option arguments: uri Option Description ------ ----------- -c, --check <Boolean> Enable initial connection check on startup (default: true) -d, --debug Enable debug logging -h, --help show help -k, --keystore_location Location of a keystore to use when setting up SSL. If specified then the CLI will prompt for a keystore password. If specified when the uri isn't https then an error is thrown. -s, --silent show minimal output -v, --verbose show verbose output
JDBC 對接的能力,讓咱們能夠與各個 SQL 生態系統打通,利用衆多現成的基於 SQL 之上的工具來使用 Elasticsearch,咱們以兩個工具來舉例。
和其餘數據庫同樣,要使用 JDBC,要下載該數據庫的 JDBC 的驅動,咱們打開: https://www.elastic.co/downloads/jdbc-client
只有一個 zip 包下載連接,下載便可。
而後,咱們這裏使用 DbVisualizer 來鏈接 ES 進行操做,這是一個數據庫的操做和分析工具,DbVisualizer 下載地址是:https://www.dbvis.com/。
下載安裝啓動以後的程序主界面以下圖:
咱們若是要使用 ES 做爲數據源,咱們第一件事須要把 ES 的 JDBC 驅動添加到 DbVisualizer 的已知驅動裏面。咱們打開 DbVisualizer 的菜單【Tools】-> 【Driver Manager】,打開以下設置窗口:
點擊綠色的加號按鈕,新增一個名爲 Elasticsearch-SQL
的驅動,url format 設置成 jdbc:es:
,以下圖:
而後點擊上圖黃色的文件夾按鈕,添加咱們剛剛下載好且解壓以後的全部 jar 文件,以下:
添加完成以後,以下圖:
就能夠關閉這個 JDBC 驅動的管理窗口了。下面咱們來鏈接到 ES 數據庫。
選擇主程序左側的新建鏈接圖標,打開向導,以下:
選擇剛剛加入的 Elasticsearch-SQL 驅動:
設置鏈接字符串,此處沒有登陸信息,若是有能夠對應的填上:
點擊 Connect
,便可鏈接到 ES,左側導航能夠展開看到對應的 ES 索引信息:
一樣能夠查看相應的庫表結果和具體的數據:
用他自帶的工具執行 SQL 也是不在話下:
同理,各類 ETL 工具和基於 SQL 的 BI 和可視化分析工具都能把 Elasticsearch 當作 SQL 數據庫來鏈接獲取數據了。
最後一個小貼士,若是你的索引名稱包含橫線,如 logstash-201811,只須要作一個用雙引號包含,對雙引號進行轉義便可,以下:
關於 SQL 操做的文檔在這裏:
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-jdbc.html
Enjoy!