ElasticSearch(十一)— Elasticsearch中的SQL语句

一、总概

Elasticsearch 在 Basic 授权中支持以 SQL 语句的形式检索文档,SQL 语句在执行时会被翻译为 DSL 执行。从语法的角度来看,Elastisearch 中的 SQL 语句与RDBMS 中的 SQL 语句基本一致, 所以对于有数据库编程基础的人来说大大降低了使用 Elaticsearch 的学习成本。

Elasticsearch 提供了多种执行SQL 语句的方法,可使用类似_search 样的 REST接口执行也可以通过命令行执行。它甚至还提供了 JDBC 和 ODBC 驱动来执行 SQL语句,但 JDBC 和 ODBC需要付费。

二、 sql 接口

在早期版本中,Elasticsearch 执行 SQL 的 REST 接口为_xpack/sql, 但在版本7 以后这个接口已经被废止而推荐使用_sql 接口。例如:

POST _sql?format=txt
{"query": "select DestCountry, OriginCountry,AvgTicketPrice from kibana_sample_data_flights where Carrier = 'Kibana Airlines' order by AvgTicketPrice desc"
}

在示例中,_sql接口通过query参数接收SQL语句,而SQL语句也包含有select、from、where、 orderby 等子句。_sql 接口的 URL 请求参数 format 定义了返回结果格式。比如在示例中定义了返回结果格式为 txt。除了 txt 以外,_sqI 接口还支持 csv、 json、tsv、yaml 等等格式。
示例中的请求会将所有航空公同为 Kibana Airines 的航班文档检索出来,并以文本表格的形式返回。
在这里插入图片描述
对于总量比较大的 SOL 查询,sql 接口还支持以游标的形式实现分页。当_sql接口的请求参数中添加了 fetch_size 参数,sql 接口在返回结来时就会根据fetch_size 参数设置的大小返回相应的条数,并在返回结果中添加游标标识。具体来说,当请求_sql 接口时设置的 forma 为 json 时,返回结果中会包含 cursor属性;而其他情况下则会在响应中添加Cursor报头。例如还是执行示例中的SOL ,但是加入分页支持:

POST _sql?format=json
{"query":"select DestCountry, OriginCountry,AvgTicketPrice from kibana_sample_data_flights where Carrier = 'Kibana Airlines' order by AvgTicketPrice desc", 
"fetch_size":10
}

在示例的请求中,为了能够在返回结果中直接看到 cursor 值,我们将 format设置为 json,可以看到:
在这里插入图片描述

POST _sql?format=json
{ "cursor":"k8OvAwFaAXN4RkdsdVkyeDFaR1ZmWTI5dWRHVjRkRjkxZFdsa0RY
RjFaWEo1UVc1a1JtVjBZMmdCRkdWV2JWZDNXRWxDTVZKMlowOXpha2R4U0RVM0F
BQUFBQUFCYk5jV1dIZ3daMFZWVld4UlNtbElSVXBTWVdaRFN6RmlVUT09/w8DA
WYLRGVzdENvdW50cnkBC0Rlc3RDb3VudHJ5AQdrZXl3b3JkAQAAAWYNT3JpZ2luQ29
1bnRyeQENT3JpZ2luQ291bnRyeQEHa2V5d29yZAEAAAFmDkF2Z1RpY2tldFByaWNlA
Q5BdmdUaWNrZXRQcmljZQEFZmxvYXQAAAABBw=="
}

在上面的请求中,参数 cursor 就是第一个请求返回结果中的 cursor 值,反复执行请求,Elasticsearch 就会将第一次请求的全部内容以每次 10 个的数量全部迭代出来。在请求完所有数据后,应该使用_sql/close 接口将游标关闭以释放资源。

POST _sql/close
{ "cursor":"k8OvAwFaAXN4RkdsdVkyeDFaR1ZmWTI5dWRHVjRkRjkxZFdsa0RY
RjFaWEo1UVc1a1JtVjBZMmdCRkdWV2JWZDNXRWxDTVZKMlowOXpha2R4U0RVM0F
BQUFBQUFCYk5jV1dIZ3daMFZWVld4UlNtbElSVXBTWVdaRFN6RmlVUT09/w8DA
WYLRGVzdENvdW50cnkBC0Rlc3RDb3VudHJ5AQdrZXl3b3JkAQAAAWYNT3JpZ2luQ29
1bnRyeQENT3JpZ2luQ291bnRyeQEHa2V5d29yZAEAAAFmDkF2Z1RpY2tldFByaWNlA
Q5BdmdUaWNrZXRQcmljZQEFZmxvYXQAAAABBw=="
}

除了 fetch_size 以外还有些可以在_sql 接口请求体中使用的参数,如下:

query 需要执行的 SQL 语句,必须要设置的参数
fetch_size 默认 1000,每次返回的行数
filter 默认 none,使用 DSL 设置过滤器
request_timeout 默认 90s,请求超时时间
page_timeout 默认 45s,分页超时时间
tume_zone 默认 Z,时区
field_multi_value_leniency 默认 false,如果一个字段返回多个值时是否忽略

在这些参数中,fiter 可以使用 DSL 对文档做过滤,支持 DSL 中介绍的所有查询条件。query 中的 SQL 语句在翻译为 DSL 后,会与 filter 中的 DSL 查询语句共同组合到 bool 查询中。其中 SQL 语句生成的 DSL 将出现在 must 子句,而 filter中的 DSL 则出现在 filter 子句中。来想要查看 SQL 语句翻译后的 DSL. 可以使用_sql/translate 执行相同的请求,在返回结果中就可以看到翻译后的 DSL 了。

三、 SQL 语法

Elasticsearch 支持传统关系型数据库 SQL 语句中的查询语句,但并不支持DML、DCL 句。换句话说,它只支持 SELECT 语句,不支持 INSERT、UPDATE、DELETE语句。SELECT 语句以外,Elaticsarch 还支持 DESCRIBE 和 SHOW 语句。

SELECT 语句

SELECT 语句用于查询文档,基本语法格式:

SELECT select _expr,
[ FROM table_name」
[WHERE condtion]
[ GROUP BY grouping_element]
[ HAVING condition J
[ ORDER BY expression [ASC|DESC]
[ LIMIT[ count]]

通过示例可以看出,Elastiesearch 的 SELECT 语句跟普通 SQL 几乎没有什么区别,支持 SELECT、FROM、 WHERE、 GROUP BY、HAVING、 ORDER BY 及 LIMTT子句。

SELECT 子句中可以使用星号或文档字段名称列表,FROM 子句则指定要检索的索引名称,而 WHERE 子句则设定了检索的条件。一般的 SQL 查询使用这三个子句就足够了,而 GROUP BY 和 HAVING 子句则用于分组,ORDER BY 子句用于排序,而 LIMIT 一般则可以用于分页。和传统 SQL 语句非常接近。

DESCRIBE 语句

DESCRIBE 语句用于查看一个索引的基础信息,在返回结果中一般会包含column、type、mapping 三个列,分别对应文档的字段名称、传统数据库类型及文档字段中的类型。例如要查看索引的基本信息:

POST _sql?format=txt
{ "query":"describe kibana_sample_data_flights"
}

在这里插入图片描述

SHOW 语句

SHOW 语句包括三种形式,即 SHOW COLUMNS、SHOW FUNCTIONS 和 SHOW TABLES。
SHOW COLUMNS 用于查看一个索引中的字段情况,它的作用与 DESCRIBE 语句完全一样,其至连返回结果都是一样的。
SHOW FUNCTIONS 用于返回在 Elastiesearch SQL 中支持的所有函数,返回结果中包括 MIN、MAX、COUNT 等常用的聚集函数。
SHOW TABLES 用看 Elaticecearch 中所有的索引。

POST _sql?format=txt
{ "query":"show columns in kibana_sample_data_flights"
}
POST _sql?format=txt
{ "query":"show functions"
}
POST _sql?format=txt
{ "query":"show tables"
}

这三种形式都支持使用 LIKE 子句过滤返回结果,LIKE 子句在用法上与 SQL语句中的 LIKE 类似。例如,“show functions like 'a%"将只返回以 a 开头的函数。

四、操作符与函数

Elasticsearch SQL 中支持的操作符与函数有 100 多种,这些操作符大多与普通 SQL 语言一致,所以这里只介绍一些与普通 SQL 语句不一样的地方。
先来看一下比较操作符。一般等于比较在 SQL 中使用等号“=”,这在ElasticsearchSQL 中也成立。但是 Elasticseareh SQL 还引人了另一个等号比较“<= >”,这种等号可以在左值为 null 时不出现异常。
在这里插入图片描述
在这里插入图片描述
LIKE 操作符,在 LIKE 子句中可以使用%代表任意多个字符,而使用下划线 _ 代表单个字符。Elasticsearch SQL 不仅支持 LIKE 子句,还支持通过 RLIKE 子句以正则表达式的形式做匹配,这大大扩展了 SQL 语句模糊匹配的能力。
尽管使用 LIKE 和 RLIKE 可以实现模糊匹配,但它离全文检索还差得很远。SQL语句的 WHERE 子句一般都是使用字段整体值做比较,而没有使用词项做匹配的能力。为此 Elasticsearch SQL 提供了 MATCH 和 OUERY 两个函数,以实现在 SQL做全文检索。例如在示例 8-33 中的两干请求分别使用 match 和 query 函数,它们的作用都是检索 DestCounty 字段为 CN 的文档:

POST _sql?format=txt
{ "query":"""
select DestCountry, OriginCountry,AvgTicketPrice,score()
from kibana_sample_data_flights
where match(DestCountry,'CN') """
}
POST _sql?format=txt
{ "query":"""
select DestCountry, OriginCountry,AvgTicketPrice,score()
from kibana_sample_data_flights
where query('DestCountry:CN') """
}

在示例中的两个请求的 selet 子句中都使用了 SCORE 函数,它的作用是获取检索的相关度评分值。

Elasticsearch SQL支持传统SQL中的聚集函数,这包括MAX、MIN、AVG、COUNT、SUM 等。同时,它还支持一些 Elasticsearch 特有的聚集函数,这些聚集函数与Elasticsearch 聚集查询相对应。这包括 FIRST/FIRST_VALUE 和 LAST/LAST VALUE, 可用于查看某个字段首个和最后一个非空值; PERCENTILE 和 PERCENTILE RANK 用于百分位聚集,KURTOSIS,SKEWNESS、STDDEV_ POP、SUM OF SQUARES 和 VAR POP 可用于运算其他统计聚集。除了以上这些函数和操作符,Elasticsearch SQL还定义了一组用于日期、数值以及字符串运算的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6605.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解Redis的Zset类型及相关命令

目录 Zset简介 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZRANGEBYSCORE ZPOPMAX BZPOPMAX ZPOPMIN BZPOPMIN ZRANK ZREVRANK ZSCORE ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZINCRBY ZINTERSTORE 内部编码 应用场景 Zset简介 有序集合相对于字符串、列表、哈希…

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年&#xff0c;科技的浪潮汹涌澎湃&#xff0c;人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰&#xff0c;方便了大家的日常生活&#xff0c;也照亮了人类未来的道路。这一年&#xff0c;科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

09_异步加载_单例模式_常量类配置_不可销毁

1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…

【Redis】事务

前言&#xff1a; 对比MySQL事务:【MySQL篇】事务的认识以及四大特性-CSDN博客 弱化的原子性: redis 没有 "回滚机制". 只能做到这些操作 "批量执行". 不能做到 "一个失败就恢复到初始状态". 不保证一致性: 不涉及 "约束". 也没有…

深度学习|表示学习|卷积神经网络|通道 channel 是什么?|05

如是我闻&#xff1a; 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;channel&#xff08;通道&#xff09; 是指输入或输出数据的深度维度&#xff0c;通常用来表示输入或输出的特征类型。 通道的含义 输入通道&#xff08;Input Channels&#xff09;&#xff1a;…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求&#xff1a; 最小硬件配置&#xff1a;2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境&#xff1a; 操作系统&#xff1a;Anolis OS 7.9 Docker&#xff1a;19.03.9版本 Kubernetes&#xff1a;v1.18.0版本 内核版本&#xff1a;5.4.203-…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…

【C语言】预处理详解

他们想要逃避工作的压迫&#xff0c;却又被功绩社会深植的价值观绑架。 预定义符号 1. C语言设置了⼀些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 1 __FILE__ //进⾏编译的源⽂件 2 __LINE__ //⽂件当前的⾏号 3 __DATE__ //⽂件被编…

探秘差分数组:算法星河中闪耀的区间掌控之星

本篇鸡汤&#xff1a;夜深人静&#xff0c;正是你追梦的时刻。熬过这段孤独&#xff0c;未来会因你而闪亮&#xff01; 探索新知&#xff0c;点亮智慧&#xff01;关注我&#xff0c;一起成长&#xff0c;点赞收藏不迷路&#xff01; 欢迎拜访&…

Ubuntu环境 nginx 源码 编译安装

ubuntu 终端 使用 wget 下载源码 sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz解压刚下载的源码压缩包 nginx-1.24.0.tar.gz sudo tar -zxvf nginx-1.24.0.tar.gz 解压完成 产生 nginx-1.24.0 目录 进入该目录 cd ./nginx-1.24.0 目录下有一个可执行文件 con…

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后&#xff0c;使用 passwd 命令来修改密码&#xff1a; passwd 系统会提…

C# volatile 使用详解

总目录 前言 在多线程编程中&#xff0c;确保线程之间的正确同步和可见性是一个关键挑战。C# 提供了多种机制来处理这些挑战&#xff0c;其中之一就是 volatile 关键字。它用于指示编译器和运行时环境不要对特定变量进行某些优化&#xff0c;以保证该变量的读写操作是线程安全…

[Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.70%跟练

在正常的开发过程中我们经常遇到一些关于热更的方案,有一些已有的方案供我们选择,但是实机情况往往不尽如人意,各有优缺点. 现在我们同样有一个热更的需求,但是要求打包简单,加载过程可查,防止出现一些资源和流程的问题. 下面介绍我在项目中使用的方案. 打包方面使用Addressabl…

Flink运行时架构

一、系统架构 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…

在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持

注&#xff1a;机翻&#xff0c;未校。 Enable SMB Direct in Windows 11 在 Windows 11 中启用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 为 SMB 3.x 文件共享协议提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…

用AI生成PPT,办公效率提升新方式

用AI生成PPT&#xff0c;办公效率提升新方式&#xff01;在快节奏的时代&#xff0c;如何优雅应对高效办公的挑战&#xff1f; 或许你也有这样的经历&#xff1a;开会前临时被要求制作PPT&#xff0c;一阵头大&#xff0c;却只能硬着头皮上。科技的发展为我们带来了更智能的解…

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件

介绍 .NET 6.0 已经发布&#xff0c;ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如&#xff0c;“谁动了我的奶酪”&#xff0c;它在哪里Startup.cs&#xff1f;在这篇文章中&#xff0c;我将深入研究这个问题&#xff0c;看看它移动到了哪里以及其他变化。…