Elasticsearch SQL
es sql是一个X-pack组件 ,允许对es执行类似sql的查询,可以将Elasticsearch SQL理解为一个编译器,既能理解es,又能理解sql。可以通过利用es,实施大规模实时读取和处理数据。
sql和es的映射关系
SQL | Elasticsearch |
columns | field |
raw | document |
table | index |
catalog or database | cluster实例 |
cluster | cluster |
先插入一些数据:
PUT /my_index/doc/_bulk
{"index":{"_id":""}}
{"name":"lily","birthday":"2000-01-01","gender":"female"}
{"index":{"_id":""}}
{"name":"kangkang","birthday":"1998-04-01","gender":"male"}
{"index":{"_id":""}}
{"name":"jane","birthday":"1995-02-07","gender":"female"}
SQL REST API
POST /_xpack/sql?format=txt
{
"query":"select * from my_index where birthday<'1999-01-01' limit 2"
}
# format类型有:json,yaml,smile,cbor,txt,csv,tsv
返回结果:
birthday | gender | name
------------------------+---------------+---------------
1998-04-01T00:00:00.000Z|male |kangkang
1995-02-07T00:00:00.000Z|female |jane
POST /_xpack/sql?
{
"query":"select * from my_index order by birthday desc",
"fetch_size":1 # fetch_size 每页返回多少个结果
}
--------->
{
"columns": [
{
"name": "birthday",
"type": "date"
},
{
"name": "gender",
"type": "text"
},
{
"name": "name",
"type": "text"
}
],
"rows": [
[
"2000-01-01T00:00:00.000Z",
"female",
"lily"
]
],
"cursor": "k4bwAgFz5AFEbkYxWlhKNVZHaGxia1psZEdOb0JRQUFBQUFBQUY3WEZrbGtNa3R5V2s1VVZFTnRORmd3Y21Gd2VHeERMVkVBQUFBQUFBQmUyeFpKWkRKTGNscE9WRlJEYlRSWU1ISmhjSGhzUXkxUkFBQUFBQUFBWHRnV1NXUXlTM0phVGxSVVEyMDBXREJ5WVhCNGJFTXRVUUFBQUFBQUFGN1pGa2xrTWt0eVdrNVVWRU50TkZnd2NtRndlR3hETFZFQUFBQUFBQUJlMmhaSlpESkxjbHBPVkZSRGJUUllNSEpoY0hoc1F5MVL/////DwMBZghiaXJ0aGRheQEAAWYGZ2VuZGVyAAABZgRuYW1lAAA="
}
# 该column对象只是第一页的一部分,当cursor结果中没有返回时,说明到达最后一页。
# 可以通过发回cursor字段继续下一页。在文本格式的情况下,光标作为Cursorhttp标头返回。
POST /_xpack/sql?format=json
{
"cursor": "k4bwAgFz5AFEbkYxWlhKNVZHaGxia1psZEdOb0JRQUFBQUFBQUY3WEZrbGtNa3R5V2s1VVZFTnRORmd3Y21Gd2VHeERMVkVBQUFBQUFBQmUyeFpKWkRKTGNscE9WRlJEYlRSWU1ISmhjSGhzUXkxUkFBQUFBQUFBWHRnV1NXUXlTM0phVGxSVVEyMDBXREJ5WVhCNGJFTXRVUUFBQUFBQUFGN1pGa2xrTWt0eVdrNVVWRU50TkZnd2NtRndlR3hETFZFQUFBQUFBQUJlMmhaSlpESkxjbHBPVkZSRGJUUllNSEpoY0hoc1F5MVL/////DwMBZghiaXJ0aGRheQEAAWYGZ2VuZGVyAAABZgRuYW1lAAA="
}
#结果--------->
{
"rows": [
[
"1998-04-01T00:00:00.000Z",
"male",
"kangkang"
]
],
"cursor": "k4bwAgFz5AFEbkYxWlhKNVZHaGxia1psZEdOb0JRQUFBQUFBQUY3WEZrbGtNa3R5V2s1VVZFTnRORmd3Y21Gd2VHeERMVkVBQUFBQUFBQmUyeFpKWkRKTGNscE9WRlJEYlRSWU1ISmhjSGhzUXkxUkFBQUFBQUFBWHRnV1NXUXlTM0phVGxSVVEyMDBXREJ5WVhCNGJFTXRVUUFBQUFBQUFGN1pGa2xrTWt0eVdrNVVWRU50TkZnd2NtRndlR3hETFZFQUFBQUFBQUJlMmhaSlpESkxjbHBPVkZSRGJUUllNSEpoY0hoc1F5MVL/////DwMBZghiaXJ0aGRheQEAAWYGZ2VuZGVyAAABZgRuYW1lAAA="
}
## -------------再次发回cursor: POST /_xpack/sql?format=json
{
"cursor": "k4bwAgFz5AFEbkYxWlhKNVZHaGxia1psZEdOb0JRQUFBQUFBQUY3WEZrbGtNa3R5V2s1VVZFTnRORmd3Y21Gd2VHeERMVkVBQUFBQUFBQmUyeFpKWkRKTGNscE9WRlJEYlRSWU1ISmhjSGhzUXkxUkFBQUFBQUFBWHRnV1NXUXlTM0phVGxSVVEyMDBXREJ5WVhCNGJFTXRVUUFBQUFBQUFGN1pGa2xrTWt0eVdrNVVWRU50TkZnd2NtRndlR3hETFZFQUFBQUFBQUJlMmhaSlpESkxjbHBPVkZSRGJUUllNSEpoY0hoc1F5MVL/////DwMBZghiaXJ0aGRheQEAAWYGZ2VuZGVyAAABZgRuYW1lAAA="
}
#结果----------------》
{
"rows": []
}
#接收到最后一页时,清空es状态,没有cursor #要提前清理状态,可以使用 clear cursor
POST _xpack/sql/close
{
"cursor": "k4bwAgFz5AFEbkYxWlhKNVZHaGxia1psZEdOb0JRQUFBQUFBQUY3NkZrbGtNa3R5V2s1VVZFTnRORmd3Y21Gd2VHeERMVkVBQUFBQUFBQmVfaFpKWkRKTGNscE9WRlJEYlRSWU1ISmhjSGhzUXkxUkFBQUFBQUFBWHZzV1NXUXlTM0phVGxSVVEyMDBXREJ5WVhCNGJFTXRVUUFBQUFBQUFGNzhGa2xrTWt0eVdrNVVWRU50TkZnd2NtRndlR3hETFZFQUFBQUFBQUJlX1JaSlpESkxjbHBPVkZSRGJUUllNSEpoY0hoc1F5MVL/////DwMBZghiaXJ0aGRheQEAAWYGZ2VuZGVyAAABZgRuYW1lAAA="
}
#结果——----------------->
{ "succeeded": true }
通过filter参数可以指定es的Query DSL来过滤
POST _xpack/sql?format=txt
{
"query":"select * from my_index order by birthday desc",
"filter":{
"term": {
"name": "kangkang"
}
},
"fetch_size":1
}
# 除了query和cursor字段外 请求还可以包括fetch_size和time_zone
# fetch_size 每页返回多少个结果
# time_zone 日期函数和日期解析的时区,默认为utc
SQL Translate API
sql translate api接受json文档中的sql并将其转换为es查询。
POST _xpack/sql/translate
{
"query":"select * from my_index order by birthday",
"fetch_size":3
}
#结果----------------->
{
"size": 3,
"_source": {
"includes": [
"gender",
"name"
],
"excludes": []
},
"docvalue_fields": [
"birthday"
],
"sort": [
{
"birthday": {
"order": "asc"
}
}
]
}
SQL CLI
可以用命令行形式,在x-pack的bin目录执行查询语句:
# ./elasticsearch-sql-cli
sql> select * from my_index where birthday<'1999-01-01';
birthday | gender | name
------------------------+---------------+---------------
1998-04-01T00:00:00.000Z|male |kangkang
1995-02-07T00:00:00.000Z|female |jane
SQL JDBC
将jdbc调用转化为es sql
SQL 语句
- describe table
# DESC table
# DESCRIBE table POST _xpack/sql?format=txt
{
"query":"describe my_index"
}
---------->
column | type
---------------+---------------
birthday |TIMESTAMP
gender |VARCHAR
gender.keyword |VARCHAR
name |VARCHAR
name.keyword |VARCHAR
- select
# SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ] - show columns
#SHOW COLUMNS [ FROM | IN ] ? table POST _xpack/sql?format=txt
{
"query":"show columns in my_index"
}column | type
---------------+---------------
birthday |TIMESTAMP
gender |VARCHAR
gender.keyword |VARCHAR
name |VARCHAR
name.keyword |VARCHAR - show functions
#SHOW FUNCTIONS [ LIKE? pattern? ]? POST _xpack/sql?format=txt
{
"query":"show functions like 'sum%'"
} name | type
---------------+---------------
SUM |AGGREGATE
SUM_OF_SQUARES |AGGREGATE - show tables
# SHOW TABLES [ LIKE? pattern? ]? POST _xpack/sql?format=txt
{
"query":"show tables like 'my_index'"
}
#------------------------>
name | type
---------------+---------------
my_index |BASE TABLE
functions and operators
- 比较运算符: = , < , <= , > , >=, 不等于 <> != <=> , between,is null/is not null
- 逻辑运算符: AND ,OR ,NOT
- 数字运算符: + - * / %
POST _xpack/sql?format=txt
{
"query":"select 1+1 as x"
}
---------->
x
---------------
2 - 数学函数: abs(绝对值), crbt(立方根),round(四舍五入)....
POST _xpack/sql?format=txt
{
"query":"select abs(age) from test_index "
}
--------->
ABS(age)
---------------
27 - 时间和日期函数: year, month, week, doy, dow, hour ,minute_of_day, minute,second,extract
POST _xpack/sql?format=txt
{
"query":"select year(cast('2018-07-12' as timestamp )) as year"
} #从日期中提取年份
------->
year
---------------
2018 - 聚合: avg , count , count(distinct) , max , min , sum
POST _xpack/sql/?format=txt
{
"query":"select avg(age) as avg from test_index"
} POST _xpack/sql?format=txt
{
"query":"select count(distinct age) as count from test_index"
} #不同值的个数
Elasticsearch SQL的更多相关文章
- 使用JDBC连接ElasticSearch6.3(ElasticSearch SQL JDBC)
使用JDBC连接ElasticSearch6.3(ElasticSearch SQL JDBC) https://blog.csdn.net/scgaliguodong123_/article/det ...
- Elasticsearch SQL用法详解
Elasticsearch SQL用法详解 mp.weixin.qq.com 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子 ...
- elasticsearch sql插件 2.4及以下版本配置
github地址:https://github.com/NLPchina/elasticsearch-sql/ 方式一:github elasticsearch-sql上提供的安装方法cmd进入到本地 ...
- 手写一个简单的ElasticSearch SQL转换器(一)
一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...
- elasticsearch sql插件配置(5.0及以上版本)
github官方参考地址:https://github.com/NLPchina/elasticsearch-sql/ 采用 git + node 的方式,所以安装前需要先安装好node,node n ...
- Elasticsearch:Elasticsearch SQL介绍及实例(二)
转载自:https://blog.csdn.net/UbuntuTouch/article/details/105699014
- Elasticsearch:Elasticsearch SQL介绍及实例 (一)
转载自:https://blog.csdn.net/UbuntuTouch/article/details/105658911
- 搜索引擎ElasticSearch系列(四): ElasticSearch2.4.4 sql插件安装
一:ElasticSearch sql插件简介 With this plugin you can query elasticsearch using familiar SQL syntax. You ...
- elasticsearch与ms sql server数据同步
MS SQL Server Download Elasticsearch Install Elasticsearch Follow instructions on https://www.elasti ...
随机推荐
- Linux 系统下 matplotlib 中文乱码解决办法
亲测有效的方法之一: 1.下载中文字体simhei.ttf SimHei可以到http://fontzone.net/download/simhei下载 2.找到matplotlib相关的font文件 ...
- k倍区间 前缀和【蓝桥杯2017 C/C++ B组】
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- HDU 5852 Intersection is not allowed!(LGV定理行列式求组合数)题解
题意:有K个棋子在一个大小为N×N的棋盘.一开始,它们都在棋盘的顶端,它们起始的位置是 (1,a1),(1,a2),...,(1,ak) ,它们的目的地是 (n,b1),(n,b2),...,(n,b ...
- BFS广度优先 vs DFS深度优先 for Binary Tree
https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/ What are BFS and DFS for Binary Tree? A Tree i ...
- oracle 之 伪列 rownum 和 rowid的用法与区别
rownum的用法 select rownum,empno,ename,job from emp where rownum<6 可以得到小于6的值数据 select rownum,empno, ...
- P3521 [POI2011]ROT-Tree Rotations
思路 发现每个子树内的交换情况不会对子树外造成影响,所以可以利用贪心的思想,线段树合并找出当前子树的合并的最小值直接累加给答案即可 我脑补的线段树合并貌似不太优秀的样子...每次都要新建节点,学习了直 ...
- Docker4之Stack
Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...
- Nuget EPPlus的使用
EPPlus:网站 Supported Functions Excel Merge Operate public class ExcelMergeOperate { private static Lo ...
- 关于python的“重载”
首先,关于python和java的区别: 1.Java有是通过方法名和方法列表来定义一个函数,python是通过方法名来定义一个函数(不允许方法名相同的函数存在) 2.java是通过定义多个相同方法名 ...
- python 获取进程数据
from multiprocessing import Process, Manager def func(dt, lt): ): key = 'arg' + str(i) dt[key] = i * ...