把 Elasticsearch SQL CLI 拿出来外面使用.

总结

从6.3版本开始,Elasticsearch提供了使用SQL进行结果查询的SQL Access功能。

CLI用于SQL访问已经包含在Elasticsearch本身中,但是希望通过外部的CI服务器或批处理程序以SQL进行SELECT并将结果保存为CSV文件的想法,是符合人情的。

让我们尝试一下,这是内容。

首先要读的东西

包含SQL CLI的可执行文件是一个独立的Java应用程序,脚本只是用来启动它。你可以将它移动到其他机器上,而无需在其上安装Elasticsearch。

您可以将其移动到其他机器上,而无需在这些机器上安装Elasticsearch。

因为上面写着这样,所以只需要把jar文件拿到其他地方运行就可以了。

该jar文件可以在/usr/share/elasticsearch/bin/elasticsearch-sql-cli-6.3.0.jar找到。(如果是Elastic公司发布的Docker镜像)

解决办法

只需将连接到Elasticsearch服务器的URL写在SQLCLI命令的第一个参数上即可。

您可以将要连接到的 Elasticsearch 实例的 URL 作为第一个参数传递:

$ ./bin/elasticsearch-sql-cli https://some.server:9200

只拿了jar文件去的例子,可以这样写。

java -jar /usr/share/elasticsearch/bin/elasticsearch-sql-cli-6.3.2.jar 

通常情况下,启动后会进入对话模式。

sql.png

如果你检查了帮助文档,就会发现没有非对话模式的选项。

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 

好像没有专门准备接受命令的选项(例如MySQL的-e选项)。

我仍然想从外部传递SQL。

您可以使用常规的管道和重定向方式将SQL语句传递。

echo "show tables;" | \
java -jar  /usr/share/elasticsearch/bin/elasticsearch-sql-cli-6.3.2.jar http:/xxx.xxx.xxx.xxx:9200

如果想要消除警告,

sql1.png

由于采用此启动方式,会出现WARNING日志,所以如果只保留标准输出的话,可以这样做。

echo "show tables;" |\
 java -jar  /usr/share/elasticsearch/bin/elasticsearch-sql-cli-6.3.2.jar \
 http:/xxx.xxx.xxx.xxx:9200 2>/dev/null 

X-Pack的标志…

你可以使用sed命令。

echo "show tables;" |\
 java -jar  /usr/share/elasticsearch/bin/elasticsearch-sql-cli-6.3.2.jar \
 http:/xxx.xxx.xxx.xxx:9200 2>/dev/null | \
 sed -e '1,26d'

sql2.png

总结

只需要一个选项简述,使用一个jar文件可以运行sqlcli是令人欣慰的。

SQLCLI的使用场景是交互式的,适用于需要做某些操作的地方。与强行单独使用相比,如果目的是通过发送预先确定的SQL并获取结果,那么使用curl发送请求到_xpack/sql会更加方便和简单(这是理所当然的结论)。

以前发表的文章

让我们庆祝Elasticsearch 6.3.0的发布,试试X-Pack SQL访问。

如果选择使用Docker

FROM openjdk:10-slim

ENV ELASTICSEARCH_URL= \
    SQL_VERSION=6.3.2

COPY run.sh /

RUN chmod +x /run.sh

ENTRYPOINT ["/run.sh"]
COPY elasticsearch-sql-cli-${SQL_VERSION}.jar /usr/share/elasticsearch/bin/

所以,run.sh是以这样的方式指定为入口点。

#!/bin/bash

SQL="-h"

if [ $# -eq 1 ]; then
  SQL=$1
fi

if [ -z "$ELASTICSEARCH_URL" ] && [ "${ELASTICSEARCH_URL:-A}" = "${ELASTICSEARCH_URL-A}" ] ; then
  ELASTICSEARCH_URL=http://localhost:9200
fi


echo $SQL | java -jar /usr/share/elasticsearch/bin/elasticsearch-sql-cli-${SQL_VERSION}.jar \
   ${ELASTICSEARCH_URL} 2>/dev/null \
   | sed -e '1,26d'

使用这种方法,通过docker run传递SQL语句将返回结果,同时使用-e选项指定Elasticsearch位置,并通过CMD传递SQL语句。

docker run --rm -it -e ELASTICSEARCH_URL=http://xxx.xxx.xxx.xxx:9200 es:latest "SELECT \* FROM test;"
sql3.png

当我尝试连接到不同版本的ES时

我试着使用版本为6.3.0的SQLCLI的jar文件,在两个环境中进行了连接测试。

    • ES6.3.2への接続は出来る

 

    ES5.6.0への接続は不可

错误:无法与服务器 http://xxx.xxx.xxx.xxx:9200 通信。该版本的CLI仅适用于Elasticsearch版本v6.3.0 [424e937]。

sql4.png

除非有特殊情况,最好将版本统一。

广告
将在 10 秒后关闭
bannerAds