把 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
通常情况下,启动后会进入对话模式。

如果你检查了帮助文档,就会发现没有非对话模式的选项。
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
如果想要消除警告,

由于采用此启动方式,会出现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'

总结
只需要一个选项简述,使用一个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;"

当我尝试连接到不同版本的ES时
我试着使用版本为6.3.0的SQLCLI的jar文件,在两个环境中进行了连接测试。
-
- ES6.3.2への接続は出来る
- ES5.6.0への接続は不可
错误:无法与服务器 http://xxx.xxx.xxx.xxx:9200 通信。该版本的CLI仅适用于Elasticsearch版本v6.3.0 [424e937]。

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