Elasticsearch SQL
Elasticsearch SQL允许执行类SQL的查询,可以使用REST接口、命令行或者是JDBC,都可以使用SQL来进行数据的检索和数据的聚合。
Elasticsearch SQL特点:
本地集成
Elasticsearch SQL是专门为Elasticsearch构建的。每个SQL查询都根据底层存储对相关节点有效执行。
没有额外的要求
不依赖其他的硬件、进程、运行时库,Elasticsearch SQL可以直接运行在Elasticsearch集群上
轻量且高效
像SQL那样简洁、高效地完成查询
1、SQL与Elasticsearch对应关系
SQL
|
Elasticsearch
|
column(列)
|
field(字段)
|
row(行)
|
document(文档)
|
table(表)
|
index(索引)
|
schema(模式)
|
mapping(映射)
|
database server(数据库服务器)
|
Elasticsearch集群实例
|
2、Elasticsearch SQL语法
SELECT select_expr [, ...] [ FROM table_name ] [ WHERE condition ] [ GROUP BY grouping_element [, ...] ] [ HAVING condition] [ ORDER BY expression [ ASC | DESC ] [, ...] ] [ LIMIT [ count ] ] [ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]
目前FROM只支持单表
3、职位查询案例
3.1、查询职位索引库中的一条数据
ormat:表示指定返回的数据类型 //1.查询职位信息 GET /_sql?format=txt { "query":"SELECT * FROM es_db limit 1" }
除了txt类型,Elasticsearch SQL还支持以下类型
格式
|
描述
|
csv
|
逗号分隔符
|
json
|
JSON格式
|
tsv
|
制表符分隔符
|
txt
|
类cli表示
|
yaml
|
YAML人类可读的格式
|
3.2、将SQL转换为DSL
GET /_sql/translate { "query":"SELECT * FROM es_db limit 1" }
结果如下: { "size" : 1, "_source" : { "includes" : [ "age", "remark", "sex" ], "excludes" : [ ] }, "docvalue_fields" : [ { "field" : "address" }, { "field" : "book" }, { "field" : "name" } ], "sort" : [ { "_doc" : { "order" : "asc" } } ] }
3.4、职位全文检索
3.4.1、需求
检索address包含广州和name中包含张三的用户。
3.4.2、MATCH函数
在执行全文检索时,需要使用到MATCH函数。
MATCH(
field_exp,
constant_exp
[, options])
field_exp:匹配字段
constant_exp:匹配常量表达式
3.4.3、实现
GET /_sql?format=txt { "query":"select * from es_db where MATCH(address, '广州') or MATCH(name, '张三') limit 10" }
4.4、通过Elasticsearch SQL方式实现分组统计
4.4.2、基于Elasticsearch SQL方式实现
GET /_sql?format=txt { "query":"select age, count(*) as age_cnt from es_db group by age" }
这种方式要更加直观、简洁。
Elasticsearch SQL目前的一些限制
目前Elasticsearch SQL还存在一些限制。例如:不支持JOIN、不支持较复杂的子查询。所以,有一些相对复杂一些的功能,还得借助于DSL方式来实现