一、Elasticsearch SQL简介

Elasticsearch SQL 是一个 X-Pack 组件,它允许对 Elasticsearch 实时执行类似 SQL 的查询。无论是使用 REST 接口、命令行还是 JDBC,任何客户机都可以使用 SQL 在 Elasticsearch 中本地搜索和聚合数据。我们可以把 Elasticsearch SQL 看作一个翻译器,它同时理解 SQL 和 Elasticsearch,并且通过 Elasticsearch 的功能,可以方便地实时读取和处理数据。

官方文档:

根据版本级别的特征支持说明:https://www.elastic.co/cn/subscriptions
免费开源的版本中,已经提供了对Elasticsearch SQL API功能的支持。

我们通过对官网链接的版本号修改会发现:
1、6.3版本还能正常访问到sql-overview相关介绍
https://www.elastic.co/guide/en/elasticsearch/reference/6.3/sql-overview.html#sql-introduction

2、切换成6.2后,出现页面不可用的提示。
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/sql-overview.html#sql-introduction

可以初步得出结论,ES6.3之后的版本才提供免费的Elasticsearch SQL的特性。

二、X-Pack 组件说明

2019年5月21日,Elastic官方发布消息: Elastic Stack 新版本6.8.0 和7.1.0的核心安全功能现免费提供。

这意味着用户现在能够对网络流量进行加密、创建和管理用户、定义能够保护索引和集群级别访问权限的角色,并且使用 Spaces 为 Kibana提供全面保护。

免费提供的核心安全功能如下:
1)TLS 功能。 可对通信进行加密;
2)文件和原生 Realm。 可用于创建和管理用户;
3)基于角色的访问控制。 可用于控制用户对集群 API 和索引的访问权限;通过针对 Kibana Spaces 的安全功能,还可允许在Kibana 中实现多租户。

1、X-Pack演变


1)5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。
2)5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pack。
3)6.3 版本之前:需要额外安装。
4)6.3版本及之后:已经集成在一起发布,无需额外安装,基础安全属于付费黄金版内容。
5)6.8.0和7 .1版本:基础安全免费。

2、X-Pack包含的特性

2018年2月28日X-Pack 特性的所有代码开源,主要包含:
Security、Monitoring、Alerting、Graph、Reporting、专门的 APM UI、Canvas、Elasticsearch SQL、Search Profiler、Grok Debugger、Elastic Maps Service zoom levels 以及 Machine Learning。

3、开源!=免费

2019年5月21日免费开放了文章开头的基础安全功能,在这之前的版本都是仅有1个月的适用期限的。
如下功能点仍然是收费的。

付费黄金版&白金版提供功能:

  • 审核日志
  • IP 筛选
  • LDAP、PKI*和活动目录身份验证
  • Elasticsearch 令牌服务

付费白金版提供安全功能:

  • 单点登录身份验证(SAML、Kerberos*)
  • 基于属性的权限控制
  • 字段和文档级别安全性
  • 第三方整合(自定义身份验证和授权 Realm)
  • 授权 Realm
  • 静态数据加密支持

三、Elasticsearch SQL入门使用

1、创建索引

PUT /library/book/_bulk?refresh
{"index":{"_id": "Leviathan Wakes"}}
{"name": "Leviathan Wakes", "author": "James S.A. Corey", "release_date": "2011-06-02", "page_count": 561}
{"index":{"_id": "Hyperion"}}
{"name": "Hyperion", "author": "Dan Simmons", "release_date": "1989-05-26", "page_count": 482}
{"index":{"_id": "Dune"}}
{"name": "Dune", "author": "Frank Herbert", "release_date": "1965-06-01", "page_count": 604}

2、使用sql查询索引数据

POST /_sql?format=txt
{"query": "SELECT * FROM library WHERE release_date < '2000-01-01'"
}

响应结果:

    author     |     name      |  page_count   | release_date
---------------+---------------+---------------+------------------------
Dan Simmons    |Hyperion       |482            |1989-05-26T00:00:00.000Z
Frank Herbert  |Dune           |604            |1965-06-01T00:00:00.000Z

3、响应的数据格式化

主要有如下格式化类型:

其中用的最多的主要是csv、json、text。

JSON:

POST /_sql?format=json
{"query": "SELECT * FROM library ORDER BY page_count DESC","fetch_size": 5
}

响应结果:

{"columns": [{"name": "author",       "type": "text"},{"name": "name",         "type": "text"},{"name": "page_count",   "type": "short"},{"name": "release_date", "type": "datetime"}],"rows": [["Peter F. Hamilton",  "Pandora's Star",       768, "2004-03-02T00:00:00.000Z"],["Vernor Vinge",       "A Fire Upon the Deep", 613, "1992-06-01T00:00:00.000Z"],["Frank Herbert",      "Dune",                 604, "1965-06-01T00:00:00.000Z"],["Alastair Reynolds",  "Revelation Space",     585, "2000-03-15T00:00:00.000Z"],["James S.A. Corey",   "Leviathan Wakes",      561, "2011-06-02T00:00:00.000Z"]],"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWWWdrRlVfSS1TbDYtcW9lc1FJNmlYdw==:BAFmBmF1dGhvcgFmBG5hbWUBZgpwYWdlX2NvdW50AWYMcmVsZWFzZV9kYXRl+v///w8="
}

CSV:

POST /_sql?format=csv
{"query": "SELECT * FROM library ORDER BY page_count DESC","fetch_size": 5
}

响应结果:

author,name,page_count,release_date
Peter F. Hamilton,Pandora's Star,768,2004-03-02T00:00:00.000Z
Vernor Vinge,A Fire Upon the Deep,613,1992-06-01T00:00:00.000Z
Frank Herbert,Dune,604,1965-06-01T00:00:00.000Z
Alastair Reynolds,Revelation Space,585,2000-03-15T00:00:00.000Z
James S.A. Corey,Leviathan Wakes,561,2011-06-02T00:00:00.000Z

4、sql查询中使用filter

POST /_sql?format=txt
{"query": "SELECT * FROM library ORDER BY page_count DESC","filter": {"range": {"page_count": {"gte" : 100,"lte" : 200}}},"fetch_size": 5
}

5、参数传递

可以直接将参数组装成完整的SQL语句,也可以使用?占位符来传参。

POST /_sql?format=txt
{"query": "SELECT YEAR(release_date) AS year FROM library WHERE page_count > ? AND author = ? GROUP BY year HAVING COUNT(*) > ?","params": [300, "Frank Herbert", 0]
}

6、使用运行时字段

POST _sql?format=txt
{"runtime_mappings": {"release_day_of_week": {"type": "keyword","script": """emit(doc['release_date'].value.dayOfWeekEnum.toString())"""}},"query": """SELECT * FROM library WHERE page_count > 300 AND author = 'Frank Herbert'"""
}

响应结果:

    author     |     name      |  page_count   |      release_date      |release_day_of_week
---------------+---------------+---------------+------------------------+-------------------
Frank Herbert  |Dune           |604            |1965-06-01T00:00:00.000Z|TUESDAY

7、Sql查询语句转为DSL查询语句

POST /_sql/translate
{"query": "SELECT * FROM library ORDER BY page_count DESC","fetch_size": 10
}

响应结果:

{"size": 10,"_source": false,"fields": [{"field": "author"},{"field": "name"},{"field": "page_count"},{"field": "release_date","format": "strict_date_optional_time_nanos"}],"sort": [{"page_count": {"order": "desc","missing": "_first","unmapped_type": "short"}}]
}

8、Sql支持的函数

查看支持的所有函数:

SHOW FUNCTIONS;

查看支持的天数相关函数:

SHOW FUNCTIONS LIKE '%DAY%';name      |     type
---------------+---------------
DAY            |SCALAR
DAYNAME        |SCALAR
DAYOFMONTH     |SCALAR
DAYOFWEEK      |SCALAR
DAYOFYEAR      |SCALAR
DAY_NAME       |SCALAR
DAY_OF_MONTH   |SCALAR
DAY_OF_WEEK    |SCALAR
DAY_OF_YEAR    |SCALAR
HOUR_OF_DAY    |SCALAR
ISODAYOFWEEK   |SCALAR
ISO_DAY_OF_WEEK|SCALAR
MINUTE_OF_DAY  |SCALAR
TODAY          |SCALAR

Elasticsearch SQL 提供了一整套内置的操作符和函数:
官网说明:sql-functions

9、子查询支持

使用子选择(SELECT x FROM (SELECT y))在很小程度上是受支持的: Elasticsearch SQL 可以将任何子选择“扁平化”为单个 SELECT。

SELECT * FROM (SELECT first_name, last_name FROM emp WHERE last_name NOT LIKE '%a%') WHERE first_name LIKE 'A%' ORDER BY 1;first_name   |   last_name
---------------+---------------Alejandro     |McAlpineAnneke        |PreusigAnoosh        |PeynArumugam      |Ossenbruggen

注意⚠️:
如果子查询中包含 GROUP BY 或 HAVING 或封闭的 SELECT语句,这些比 SELECT X FROM (SELECT ...) WHERE [simple_condition]更复杂的查询,目前不支持。

更多ES中SQL查询的限制,可以查看官网说明SQL Limitations

10、SQL分页查询支持

1)使用limit限制返回记录数:

POST /_sql?format=txt
{"query": "SELECT * FROM library limit 2"
}

2)使用top函数限制返回记录数:

POST /_sql?format=txt
{"query": "SELECT top 2 * FROM library"
}

3)使用fetch_size参数限制返回记录数:

POST /_sql?format=txt
{"query": "SELECT * FROM library","fetch_size":2
}

4)采用limit结合自查询进行分页查询:

POST /_sql?format=txt
{"query": "SELECT * FROM (SELECT * FROM library limit 2) limit 1"
}

5)通过游标访问下一页:
说明:
在采用CSV, TSV 和 TXT 格式化返回时, 会返回一个游标值cursor,通过游标值我们可以继续访问下一页。
这种方式非常时候大数据量的分页返回。

POST /_sql?format=json
{"query": "SELECT * FROM library ORDER BY page_count DESC","fetch_size": 5
}
响应结果:```csharp
{"columns": [{"name": "author",       "type": "text"},{"name": "name",         "type": "text"},{"name": "page_count",   "type": "short"},{"name": "release_date", "type": "datetime"}],"rows": [["Peter F. Hamilton",  "Pandora's Star",       768, "2004-03-02T00:00:00.000Z"],["Vernor Vinge",       "A Fire Upon the Deep", 613, "1992-06-01T00:00:00.000Z"],["Frank Herbert",      "Dune",                 604, "1965-06-01T00:00:00.000Z"],["Alastair Reynolds",  "Revelation Space",     585, "2000-03-15T00:00:00.000Z"],["James S.A. Corey",   "Leviathan Wakes",      561, "2011-06-02T00:00:00.000Z"]],"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWWWdrRlVfSS1TbDYtcW9lc1FJNmlYdw==:BAFmBmF1dGhvcgFmBG5hbWUBZgpwYWdlX2NvdW50AWYMcmVsZWFzZV9kYXRl+v///w8="
}

通过游标访问下一页:

POST /_sql?format=json
{"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWYUpOYklQMHhRUEtld3RsNnFtYU1hQQ==:BAFmBGRhdGUBZgVsaWtlcwFzB21lc3NhZ2UBZgR1c2Vy9f///w8="
}

四、Elasticsearch和SQL对应关系

虽然 SQL 和 Elasticsearch 对于数据的组织方式(以及不同的语义)有不同的术语,但本质上它们的用途是相同的。

SQL Elasticsearch 说明
column field 在 Elasticsearch 字段时,SQL 将这样的条目调用为 column。注意,在 Elasticsearch,一个字段可以包含同一类型的多个值(本质上是一个列表) ,而在 SQL 中,一个列可以只包含一个表示类型的值。Elasticsearch SQL 将尽最大努力保留 SQL 语义,并根据查询的不同,拒绝那些返回多个值的字段。
row document 列和字段本身不存在; 它们是行或文档的一部分。两者的语义略有不同: 行row往往是严格的(并且有更多的强制执行),而文档往往更灵活或更松散(同时仍然具有结构)。
table index 在 SQL 还是 Elasticsearch 中查询针对的目标
schema 在关系型数据库中,schema 主要是表的名称空间,通常用作安全边界。Elasticsearch没有为它提供一个等价的概念。

总结

本文主要介绍了Elasticsearch SQL的使用。如果你对DSL查询语句不熟悉,那么采用SQL查询索引数据将是一个非常简单,0门槛入门的好方法。
1、注意ES在6.3版本之后才原生支持SQL查询。
2、可以通过translate API将sql语句转为DSL语句。
3、ES的SQL查询提供对自查询的简单支持。
4、通过SHOW FUNCTIONS可以查看ES的SQL查询支持的函数。
5、ES的SQL查询可以通过游标cursor实现分页查询。

ES中SQL查询详解相关推荐

  1. ES深度分页查询详解

    一.ES支持的三种分页查询方式 From + Size 查询 Scroll 遍历查询 Search After 查询 说明: 官方已经不再推荐采用Scroll API进行深度分页.如果遇到超过1000 ...

  2. SQL语句详解(四)——SQL联表查询

    今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询. 一.SQL联表查询简介 在前文SQL语句详解(三)--SQL子查询中,我们给大家介绍了SQL子查询的相关知识和使用示例.实际上 ...

  3. sql语句中exists用法详解

    文章目录 一.语法说明 exists: not exists: 二.常用示例说明 1.查询a表在b表中存在数据 2.查询a表在b表中不存在数据 3.查询时间最新记录 4.exists替代distinc ...

  4. oracle 数据库循环查询语句怎么写,sql循环查询(sql语句循环查询详解)

    sql循环查询(sql语句循环查询详解) 2020-07-24 11:15:51 共10个回答 select*fromawheret_idin('3','4');select*fromawheret_ ...

  5. oracle分页查询sql语句通用,oracle分页查询sql语句,oracle分页查询sql语句详解

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句 Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点 ...

  6. ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)

    ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2) 1. 前提 2. 轻量搜索 2.1 单条件查询 2.2 多条件查询 2.3 不指定属性查询(查询所有文档属性)-- ...

  7. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

  8. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

  9. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

最新文章

  1. 沈阳农业大学计算机往年录取分数6,沈阳农业大学历年分数线 2021沈阳农业大学录取分数线...
  2. 【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)
  3. Flink从入门到精通100篇(七)-如何基于 Flink 搭建一个实用有效的在线实时反欺诈平台?
  4. 北京内推 | 微软亚洲互联网工程院(STCA)招聘NLP科研实习生
  5. 创建vue-cli项目
  6. 超简单的利用plist 查看ipa包名及其它信息
  7. android activity启动模式_从0系统学Android--2.5Activity启动模式
  8. minus sql oracle,在T-SQL中实现Oracle的MINUS集合运算符
  9. Atitti css transition Animation differ区别
  10. 使用Python实现消息轰炸
  11. PCB多层板设计规范
  12. 流量控制理论与Sentinel
  13. 饭饭的零基础神经网络学习笔记——python,numpy,scipy,matplotlib简明教程
  14. 贝叶斯在计算机视觉中的应用,KNN与朴素贝叶斯在计算机视觉的鱼苗计数中的应用探索.doc...
  15. 处理数据之把省市自治区这样的字眼切除
  16. 全家Fa米家app抓包——做自动签到领Fa米粒
  17. 论文介绍--Spatio-Temporal Dynamics and Semantic Attribute Enriched Visual Encoding for Video Captioning
  18. Excel:表格中重复项的处理
  19. Unknown custom element:xxxx- did you register the component correctly? For recursive compo
  20. Qt QMenuBar QMenu和QAction

热门文章

  1. 《Fundamentals of Computer Grahpics 4ed》虎书第四版翻译——第一章 介绍
  2. 《深入理解Windows操作系统》笔记4
  3. ifc97水蒸气c语言计算程序,IFC97水和蒸汽性质计算公式介绍详解.doc
  4. Hadoop内hive之间,hive与DB、ES等之间数据交互的问题与解决方案
  5. 支持兆芯cpu的linux,AIDA64 6.10版发布:全面支持中国兆芯、海光x86 CPU
  6. 香农采样定理及其证明
  7. VB编程:While...Wend语句实例漂亮的星星-17
  8. SCM软件配置管理 (一)SVN 与 CVS
  9. golang 关于%!(EXTRA xxx=xxx)的异常
  10. Bugku——可爱的故事