ElasticSearch的sql语法说明和简单使用
出自 图灵学院 ElasticSearch课程
我自己学完了,然后给老师的代码和讲义自己练习了一遍,然后整理了一下,做了个笔记
概述
Elasticsearch SQL允许执行类SQL的查询,可以使用REST接口、命令行或者是JDBC,都可以使用SQL来进行数据的检索和数据的聚合。
Elasticsearch SQL特点:
- 本地集成
Elasticsearch SQL是专门为Elasticsearch构建的。每个SQL查询都根据底层存储对相关节点有效执行。
- 没有额外的要求
不依赖其他的硬件、进程、运行时库,Elasticsearch SQL可以直接运行在Elasticsearch集群上
- 轻量且高效
像SQL那样简洁、高效地完成查询
SQL与Elasticsearch对应关系
SQL | Elasticsearch |
---|---|
column(列) | field(字段) |
row(行) | document(文档) |
table(表) | index(索引) |
schema(模式) | mapping(映射) |
database server(数据库服务器) | Elasticsearch集群实例 |
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只支持单表
Elasticsearch SQL目前的一些限制
目前Elasticsearch SQL还存在一些限制。例如:不支持JOIN、不支持较复杂的子查询。所以,有一些相对复杂一些的功能,还得借助于DSL方式来实现。
另外现在ElasticSearch中 还是dsl语句是主流语句,sql语句在ElasticSearch中不是那么的成熟.
案例
查询职位索引库中的一条数据
format:表示指定返回的数据类型
//1.查询职位信息
GET /_sql
{"query":"SELECT * FROM es_db limit 1"
}
结果
{"columns" : [{"name" : "address","type" : "text"},{"name" : "age","type" : "long"},{"name" : "city","type" : "text"},{"name" : "name","type" : "text"},{"name" : "provice","type" : "text"},{"name" : "remark","type" : "text"},{"name" : "sex","type" : "long"},{"name" : "street","type" : "text"}],"rows" : [["广州荔湾大厦",28,null,"李四",null,"java assistant",1,null]]
}
结果返回表的格式
默认是返回json格式的结果
GET /_sql?format=txt
{"query":"SELECT * FROM es_db limit 1"
}
结果
address | age | city | name | provice | remark | sex | street
---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------
广州荔湾大厦 |28 |null |李四 |null |java assistant |1 |null
除了txt类型,Elasticsearch SQL还支持以下类型,
格式 | 描述 |
---|---|
csv | 逗号分隔符 |
json | JSON格式 |
tsv | 制表符分隔符 |
txt | 类cli表示 |
yaml | YAML人类可读的格式 |
使用tsv格式
GET /_sql?format=tsv
{"query":"SELECT * FROM es_db limit 1"
}
结果
address age city name provice remark sex street
广州荔湾大厦 28 李四 java assistant 1
将SQL转换为DSL
将sql转成dsl语句, 这种使用场景是:比如说你MySQL用的非常的6 ,但是你不太会ElasticSearch的dsl语法,那么就可以把你想查询的效果用sql语句写出来,然后再翻译成dsl语句.
输入:
GET /_sql/translate
{"query":"SELECT * FROM es_db where address = '广州荔湾大厦'"
}
结果:
{"size" : 1000,"query" : {"term" : {"address.keyword" : {"value" : "广州荔湾大厦","boost" : 1.0}}},"_source" : {"includes" : ["address","age","city","name","provice","remark","sex","street"],"excludes" : [ ]},"sort" : [{"_doc" : {"order" : "asc"}}]
}
然后你把翻译的语句跟上 dsl语句的请求地址 比如说: GET /es_db/_search ,这样就可以使用了.
GET /es_db/_search
{"size" : 1000,"query" : {"term" : {"address.keyword" : {"value" : "广州荔湾大厦","boost" : 1.0}}},"_source" : {"includes" : ["address","age","city","name","provice","remark","sex","street"],"excludes" : [ ]},"sort" : [{"_doc" : {"order" : "asc"}}]
}
职位全文检索
检索address包含广州和name中包含张三的用户。
在执行全文检索时,需要使用到MATCH函数。
MATCH(field_exp, constant_exp [, options])
field_exp:匹配字段
constant_exp:匹配常量表达式
用sql语句可以这么写:
GET /_sql?format=txt
{"query":"select * from es_db where MATCH(address, '广州') or MATCH(name, '张三') limit 10"
}
结果:
address | age | city | name | provice | remark | sex | street
---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------
广州荔湾大厦 |28 |null |李四 |null |java assistant |1 |null
广州白云山公园 |26 |null |rod |null |php developer |0 |null
通过Elasticsearch SQL方式实现分组统计
输入:
GET /_sql?format=txt
{"query":"select age, count(*) as age_cnt from es_db group by age"
}
结果:
age | age_cnt
---------------+---------------
19 |1
22 |1
25 |1
26 |1
28 |1
这种方式要更加直观、简洁。
ElasticSearch的sql语法说明和简单使用相关推荐
- Access SQL语法(查询/插入/删除/连接/修改)
SQL语法 1. 查询 简单查询 select 班级,姓名,性别 from 学生名单 加筛选条件 select 班级,姓名,性别 from 学生名单 where 性别="女" 分组 ...
- PLY库-实现最简单的sql语法的数据库
本文通过PLY实现一个简单的sql库 本文主要简述一下,有关语法解析的库的使用,并使用改实例编写一个简单的模仿最基本的sql语句的数据库,本文代码仅供示例参考. 语法解析与上下文 语法解析是一个比较大 ...
- Python SQL 语法简单入门
Python SQL 语法简单入门 大家好,今天给大家分享一些python中基本的sql语法.基本是按照sqlite3 来写的. 引题 为什么要使用数据库? 持久化 ,内存中的变量当程序重启和电脑断电 ...
- 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷
使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 posted on 2016-11-14 13:11 lexus ...
- 关系代数和SQL语法
数据分析的语言接口 OLAP计算引擎是一架机器,而操作这架机器的是编程语言.使用者通过特定语言告诉计算引擎,需要读取哪些数据.以及需要进行什么样的计算.编程语言有很多种,任何人都可以设计出一门编程语言 ...
- ORACLE分页查询SQL语法——最高效的分页
--1:无ORDER BY排序的写法.(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT *FROM (SELECT ...
- orcle与mysql的区别_Orcle与MySQL的SQL语法区别:
Orcle与MySQL的SQL语法区别: 1.在Oracle中用 select * from all_users显示所有的用户,而在MySQL中显示所有数据 库的命令是 show databases ...
- mysql中以下正确的sql是_总结MySQL中SQL语法的使用
--where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
最新文章
- phpDocument(PHPDoc) 标签大全
- 四大技巧轻松搞定云容器
- java多线程打印helloworld,Java并发编程--多线程之HelloWorld
- PHP|Yii2下通过插件进行图片处理(亲测可用)
- KICAD | 分享一个必须安装的插件Interactive HTML BOM plugin for KiCad
- then 微信小程序_微信小程序 引入es6 promise
- SPH算法(求最小代价树)
- 在linux下一般用scp这个命令来通过ssh传输文件
- Spring Security——异常信息本地化
- [经典好文] 谈笑色影间,人生本无忌 (转于色影无忌)
- 单片机制作工具大汇总!!
- ExoPlayer+FFMpeg软解
- YY淘宝商品数据库设计
- 使用teamviewer和向日葵时Visual studio等软件显示全白或者全黑的解决办法!
- at命令不生效 linux_linux中at命令详解
- 路由之间的转跳及传参
- android studio安装apk时,vivo 部分手机出现 解析软件包错误
- java计算机毕业设计汽车票订购系统源码+程序+lw文档+mysql数据库
- 人工智能全球赛:中国“智能+”要冲浪还缺百万人才
- angularjs ng-repeat
热门文章
- Ubuntu使用networking服务来管理网络
- Python 实现将 Unix 时间戳转化为实际时间
- Siemens-PLM-TeamCenter虚拟机安装与配置
- c 语言程序的三种基本结构,C 语言程序的三种基本结构是____ A、顺序结构,选择结构,循环结构 B、递归结构,循环结构,转移结构...
- 复旦FM17522芯片读写M1卡(S50/S70)、CPU卡要点摘录
- mysql数据库+易语言的应用_易语言mysql数据应用源码
- 注册会计师考试时可用计算机吗,距离注册会计师考试仅有4天,注意好这9点机考少丢分...
- 计算机网络系统集成有哪些方面,计算机网络中系统集成主要包含哪些?
- 项目案例:QQ数据库管理
- IDC防火墙配置CISCO ASA5520