转载并且补充:https://elasticsearch.cn/article/687‘
首先,我们创建一条数据:
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 的语法如下:
POST /_xpack/sql?format=txt { "query": "SELECT * FROM twitter" }
因为 sql 特性是 xpack 的免费功能,所以是在 _xpack 这个路径下面,我们只需要把 sql 语句传给 query 字段就行了,注意最后面不要加上 ; 结尾,注意是不要!
_xpack
;
我们执行上面的语句,查询返回的结果如下:
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 like 'twit%'" } POST /_xpack/sql?format=txt { "query": "SHOW TABLES like 'twitte_'" }
上面返回的结果都是:
name | type ---------------+--------------- twitter |BASE TABLE
如果不加like会报错:【Elasticsearch】es SQL no_viable_alt_exception line 1:15: no viable alternative at input
如果要查看该索引的字段和元数据,如下:
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" } column | type | mapping ---------------+---------------+--------------- date |TIMESTAMP |datetime id |BIGINT |long name |VARCHAR |text name.keyword |VARCHAR |keyword twitter |VARCHAR |text twitter.keyword|VARCHAR |keyword
另外,如果不记得 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 like '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" } score() | date | id | name | twitter ---------------+------------------------+---------------+---------------+--------------- 0.5753642 |2018-07-27T00:00:00.000Z|123 |medcl |sql is awesome
最后,还能试试 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 程序即可进入命令行交互提示界面,如下:
[lcc@lcc ~/soft/es/elasticsearch-7.8.0]$ ./bin/elasticsearch-sql-cli future versions of Elasticsearch will require Java 11; your Java version from [/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre] does not meet this requirement asticElasticE ElasticE sticEla sticEl ticEl Elast lasti Elasti tic cEl ast icE icE as cEl icE as cEl icEla las El sticElasticElast icElas las last ticElast El asti asti stic El asticEla Elas icE El Elas cElasticE ticEl cE Ela ticEl ticElasti cE las astic last icE sticElas asti stic icEl sticElasticElast icE sticE ticEla icE sti cEla icEl sti Ela cEl sti cEl Ela astic ticE asti ElasticElasti ticElasti lasticElas ElasticElast sql 7.8.0 sql>
当你看到一个硕大的ES,表示 sql 命令行已经准备就绪了,查看一下索引列表,不,数据表的列表:
sql> show tables; name | type | kind ------------------------------+---------------+--------------- .apm-agent-configuration |TABLE |INDEX .apm-custom-link |TABLE |INDEX .async-search |TABLE |INDEX .kibana |VIEW |ALIAS .kibana-event-log-7.8.0 |VIEW |ALIAS .kibana-event-log-7.8.0-000001|TABLE |INDEX
各种操作妥妥的,上面已经测试过的命令就不在这里重复了,只是体验不一样罢了。
如果要连接远程的 ES 服务器,只需要启动命令行工具的时候,指定服务器地址,如果有加密,指定 keystone 文件,完整的帮助如下:
[lcc@lcc ~/soft/es/elasticsearch-7.8.0]$ ./bin/elasticsearch-sql-cli --help future versions of Elasticsearch will require Java 11; your Java version from [/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre] does not meet this requirement Elasticsearch sql CLI Non-option arguments: uri Option Description ------ ----------- -b, --binary <Boolean> disable binary communication. Enabled by default. Accepts 'true' or 'false' values. (default: true) -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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。