玩转 Elasticsearch 的 SQL 功能

首先看看接口的支持情况

目前支持的 SQL 只能进行数据的查询只读操作,不能进行数据的修改,所以我们的数据插入还是要走之前的常规索引接口。

目前 Elasticsearch 的支持 SQL 命令只有以下几个:

命令说明DESC table用来描述索引的字段属性SHOW COLUMNS功能同上,只是别名SHOW FUNCTIONS列出支持的函数列表,支持通配符?过滤SHOW TABLES返回索引列表SELECT .. FROM table_name WHERE .. GROUP BY .. HAVING .. ORDER BY .. LIMIT ..用来执行查询的命令

我们分别来看一下各自怎么用,以及有什么效果吧,自己也可以动手试一下,看看。

首先,我们创建一条数据:

POST twitter/doc/

{

  "name":"medcl",

  "twitter":"sql is awesome",

  "date":"2018-07-27",

  "id":123

}

RESTful下调用SQL

在 ES 里面执行 SQL 语句,有三种方式,第一种是 RESTful 方式,第二种是 SQL-CLI 命令行工具,第三种是通过 JDBC 来连接 ES,执行的 SQL 语句其实都一样,我们先以 RESTful 方式来说明用法。

RESTful 的语法如下:

POST /_xpack/sql?format=txt

{

    "query": "SELECT * FROM twitter"

}

因为 SQL 特性是 xpack 的免费功能,所以是在 _xpack 这个路径下面,我们只需要把 SQL 语句传给 query 字段就行了,注意最后面不要加上 ; 结尾,注意是不要!

我们执行上面的语句,查询返回的结果如下:

          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-CLI下的使用

上面的例子基本上把 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     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 对接

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 数据库来连接获取数据了。

需要大数据视频学习资料的 可以私信回复“大数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容