Elasticsearch SQL的用法是什么
Elasticsearch SQL的用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
小编将介绍不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子。
Elasticsearch 5.x版本中,SQL功能还没有集成到Elasticsearch源码中,需要下载第三方插件后才能使用,配置过程如下:
1.安装ES-SQL依赖node npm
ES-SQL 5.x版本以后,安装需要依赖node和npm,先安装node和npm,安装后在检查node及npm的安装,命令如下:
yum-yinstallnodejsnpmnode-v npm-v
2.下载ES-SQL并安装
然后切换到ES的根目录下,执行如下命令,下载并安ES-SQL插件:
./bin/elasticsearch-plugininstallhttps://github.com/NLPchina/elasticsearch-sql/releases/download/5.6.30/.elasticsearch-sql-5.6.3.0.zip
离线包安装可以执行:
./bin/elasticsearch-plugininstallfile:/elasticsearch-sql-5.6.3.0.zip
3.重启ES服务
执行完上述三步,你就可以使用SQL探索数据了,以kibana中的使用为例:
二、6.4 Elasticsearch SQL用法
首先我们看下Elasticsearch SQL和标准SQL中数据类型的对应关系:
Elasticsearch SQL支持三种client:REST Interface, command-line,JDBC
2.1 REST Interface
建议先在kibana中测试(可以一次执行多个SQL),查询通过之后把查询copy到项目中进行测试。
6.3+ Elasticsearch SQL有个非常实用的功能,就是可以用translate api把SQL语句翻译成ES DSL语句,对于学习DSL感到头痛的同学有福啦。
2.2 command-line
命令行界面的进入方式:
./elasticsearch-sql-cliIP:PORT(本机ip和es的端口)
进入后的界面如下:
命令行一般作为SQL测试时使用。
2.3 JDBC
该组件为X-Pack中的收费组件,感兴趣的同学可以参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-jdbc.html
注意:查询单个索引名一定要用""引上,否则会报错
*查看当前用户所有的索引:“SHOW TABLES;”
精准查询某个索引:“SHOW TABLES LIKE ‘indexname’;”
通配符查询某些索引:“SHOW TABLES LIKE ‘ ’;”
*查看某个索引结构:“DESCRIBE table;” 或者 “DESC table;”
上面两个命令都是“SHOW COLUMNS [ FROM | IN ] ? table”命令的别名
*查看函数:“SHOW FUNCTIONS [ LIKE? pattern? ]?”
精准查询某个函数:
通配符查询某些函数:
查看所有函数:
常用的聚合函数:
SELECTMIN(value_1)min,MAX(value_1)max,AVG(value_1)avg,SUM(value_1)sum,COUNT(*)count,COUNT(DISTINCTvalue_1)dictinct_countFROM"micloud_es_sink_zhouyongbo_test-2018.10.19”;
SELECT语句的语法排序如下:
SELECTselect_expr[,...][FROMtable_name][WHEREcondition][GROUPBYgrouping_element[,...]][HAVINGcondition][ORDERBYexpression[ASC|DESC][,...]][LIMIT[count]]
*限定返回数据的条数:“limit”
SELECT*FROM"micloud_es_sink_zhouyongbo_test-2018.10.19”limit10;
注意SQL中的limit比fetch_size中的优先级高,例如下面的例子返回的是5条 :
{"query":"SELECT*FROM"micloud_es_sink_zhouyongbo_test-2018.10.19”limit5","fetch_size":10}
*排序:“order by + 字段名字 + asc/desc”
SELECT*FROM"micloud_es_sink_zhouyongbo_test-2018.10.19”ORDERBYvalue_1asc/desc;
根据多个字段排序:
selectcityc,value_1+1vpfrom"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbyc,vporderbycdesc,vpasc;
*WHERE根据条件查询:
WHERE后面跟ES复杂数据类型:
SELECTfirst_nameFROMindexWHEREfirst_name.raw=‘John’;
WHERE后面跟多个查询条件:
SELECT*FROMmicloud_es_sink_zhouyongbo_test*wherecity=‘北京'andvalue_1=8ORDERBYvalue_1desc;
*group by分组查询:
根据单个字段分组查询:
selectcity,count(city)ascount_city,sum(value_1)ascount_value_1from"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbycity;
根据多个字段分组查询:
selectcity,count(city)count_city,sum(value_1)count_value_1from"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbycity,value_1;
对于比较长的字段,也可以对该字段声明别名,并对别名进行分组查询,声明字段别名的“as”可省略:
selectcityc,count(city)count_city,sum(value_1)count_value_1from"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbyc,value_1;
还可以对某字段进行计算,然后按照计算结果分组查询:
selectcityc,value_1+1vpfrom"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbyc,vp;
*HAVING过滤分组结果(ES-SQL引擎同样会在分组之后计算HAVING语句):
Selectcityc,count(*)countfrom"micloud_es_sink_zhouyongbo_test-2018.10.19"groupbychavingcount>53834;
*查询嵌套类型:
select*fromzhouyongbo_test04wherelove.kaishu=‘鲁公’;
*用通配符查询多个索引:
注意被查询索引必须有相同的mapping,否则会有如下报错:
常用的方法和操作汇总:
*比较操作:
Equality (=)
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1=6limit5;
Inequality (<>or!=or
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1<>6limit5;
Comparison (<,
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1>=6limit5;
BETWEEN
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1between6and8limit5;
IS NULL/IS NOT NULL
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1isnotNULLlimit5;
*逻辑操作:
AND
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1>5andvalue_1<7limit5;
OR
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherevalue_1=5orvalue_1=7limit5;
NOT
select*from"micloud_es_sink_zhouyongbo_test-2018.10.19"wherenotvalue_1>5limit5;
*数学运算操作:
Add (+)
select1+1asx;
Subtract (infix-)
select1-1asx;
Negate (unary-)
select-1asx;
Multiply (*)
select6*6asx;
Divide (/)
select30/5asx;
Moduloor Reminder(%)
select30%7asx;
*数学函数:(分为通用函数和三角函数两部分 ):
通用函数:
ABS:求数字的绝对值
selectABS(value_1)from"micloud_es_sink_zhouyongbo_test-2018.10.19"limit5;
CBRT:求数字的立方根,返回double
selectvalue_1v,CBRT(value_1)cbrtfrom"micloud_es_sink_zhouyongbo_test-2018.10.19"limit5;
CEIL:返回大于或者等于指定表达式最小整数(double)
selectvalue_1v,CEIL(value_1)from"micloud_es_sink_zhouyongbo_test-2018.10.19"limit5;
CEILING:等同于CEIL
selectvalue_1v,CEILING(value_1)from"micloud_es_sink_zhouyongbo_test-2018.10.19"limit5;
E:返回自然常数e(2.718281828459045)
selectvalue_1,E(value_1)from"micloud_es_sink_zhouyongbo_test-2018.10.19"limit5;
ROUND:四舍五入精确到个位
selectROUND(-3.14);
FLOOR:向下取整
selectFLOOR(3.14);
LOG:计算以2为底的自然对数
selectLOG(4);
LOG10:计算以10为底的自然对数
selectLOG10(100);
SQRT:求一个非负实数的平方根
selectSQRT(9);
EXP:此函数返回e(自然对数的底)的X次方的值
selectEXP(3);
EXPM1:返回ex-1
selectEXPM1(3);
三角函数:
DEGREES:返回X从弧度转换为度值
selectDEGREES(x);
RADIANS:返回X从度转换成弧度的值
selectRADIANS(x);
SIN:返回X的正弦
selectSIN(x);
COS:返回X,X值是以弧度给出的余弦值
selectCOS(角度);
TAN:返回参数X,表示以弧度的切线值
selectTAN(角度);
ASIN:返回X的反正弦,X的值必须在-1至1范围内,返回NULL
selectASIN(x);
ACOS:返回X的反正弦,X值必须-1到1之间范围否则将返回NULL
selectACOS(x);
ATAN:返回X的反正切
selectATAN(x);
SINH:返回X的双曲正弦值
selectSINH(x);
COSH:返回X的双曲余弦值
selectCOSH(x);
*日期和时间处理相关方法:
YEAR:
SELECTYEAR(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASyear;
MONTH_OF_YEAR()orMONTH():
SELECTMONTH(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASmonth;
WEEK_OF_YEAR()orWEEK():
SELECTWEEK(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASweek;
DAY_OF_YEAR()orDOY(),效果等同于EXTRACT(
SELECTDOY(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASday;
DAY_OF_MONTH(),DOM(), orDAY():
SELECTDAY(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASday;
DAY_OF_WEEK()orDOW():
SELECTDOW(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASday;
HOUR_OF_DAY()orHOUR():
SELECTHOUR(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))AShour;
MINUTE_OF_DAY():
SELECTMINUTE_OF_DAY(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASminute;
MINUTE_OF_HOUR()orMINUTE():
SELECTMINUTE(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASminute;
SECOND_OF_MINUTE()orSECOND():
SELECTSECOND(CAST('2018-10-23T16:59:27Z'ASTIMESTAMP))ASsecond;
如上就是6.4 Elasticsearch SQL支持的主要用法了,如果在优化SQL语句之后还不满足查询需求,可以拿SQL和DSL混用,ES会先根据SQL进行查询,然后根据DSL语句对SQL的执行结果进行二次查询,下面是个小例子:
POST/_xpack/sql?format=txt{"query":"SELECT*FROMlibraryORDERBYpage_countDESC","filter":{"range":{"page_count":{"gte":100,"lte":200}}},"fetch_size":5}
这个查询就会先根据“query”后面的SQL进行查询,然后用执行“filter”和“fetch_size” DSL语法对查询结果进行过滤,进而返回最终结果。
关于Elasticsearch SQL的用法是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。