es应用笔记2-sql查询

es作为一个搜索索引,在分析场景中,作为明细查询的场景会比kylin、impala、hive等更加合适。

es在6.3版本开始支持sql查询,且其sql基础语法与大数据端的语法较兼容,函数库略有不同。

对于多数据源的接入,通过jdbc接入es改造成本较低,但是xpack-sql-jdbc这个客户端的包是收费的,但是其服务端仍提供了rest api 供查询。

界面查询

kibana中添加简单数据

选择想要的一个栗子

开发者工具查询

  • 进入开发者工具界面

  • 查看有什么表

    使用 SHOW TABLES查询

  • 查看表有什么列

    使用 DESCRIBE [TABLENAME]

  • SQL查询记录

    查询一下延误的航班

REST API

​ REST API 才是其他程序可以通过SQL查询ES的关键。

kibana rest api

​ 通过浏览器F12可以获取到查询kibana的api接口,不过我们并不关心它的API:

curl 'http://localhost:5601/api/console/proxy?path=%2F_sql%3Fformat%3Dtxt&method=POST' \-H 'Connection: keep-alive' \-H 'sec-ch-ua: "Chromium";v="98", " Not A;Brand";v="99"' \-H 'Accept: text/plain, */*; q=0.01' \-H 'Content-Type: application/json' \-H 'sec-ch-ua-mobile: ?0' \-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.136 Safari/537.36' \-H 'kbn-version: 7.6.2' \-H 'sec-ch-ua-platform: "Windows"' \-H 'Origin: http://localhost:5601' \-H 'Sec-Fetch-Site: same-origin' \-H 'Sec-Fetch-Mode: cors' \-H 'Sec-Fetch-Dest: empty' \-H 'Referer: http://localhost:5601/app/kibana' \-H 'Accept-Language: zh-CN,zh;q=0.9,zh-Hans;q=0.8,en;q=0.7' \--data-raw $'{\r\n  "query": "select t.Dest from kibana_sample_data_flights t limit 20"\r\n}\n' \--compressed

es rest api

​ 其实kibana的开发者工具已经告诉我们ES的查询API为POST /_sql?format=txt,那么稍作改造直接发给ES:

curl 'http://localhost:9200/_sql?format=txt' \-H 'Connection: keep-alive' \-H 'Accept: text/plain, */*; q=0.01' \-H 'Content-Type: application/json' \-d $'{\r\n  "query": "select t.Dest from kibana_sample_data_flights t limit 20"\r\n}\n' \--compressed

​ 其结果如下:

sh-4.2# curl 'http://localhost:9200/_sql?format=txt' \
>   -H 'Connection: keep-alive' \
>   -H 'Accept: text/plain, */*; q=0.01' \
>   -H 'Content-Type: application/json' \
>   -d $'{\r\n  "query": "select t.Dest from kibana_sample_data_flights t limit 1"\r\n}\n' \
>   --compressedDest
--------------------------------------------
Sydney Kingsford Smith International Airport

​ 对于应用程序,我们选择接收JSON,那么format=json即可,结果如下:

sh-4.2# curl 'http://localhost:9200/_sql?format=json' \
>   -H 'Connection: keep-alive' \
>   -H 'Accept: text/plain, */*; q=0.01' \
>   -H 'Content-Type: application/json' \
>   -d $'{\r\n  "query": "select t.Dest from kibana_sample_data_flights t limit 1"\r\n}\n' \
>   --compressed
{"columns":[{"name":"Dest","type":"keyword"}],"rows":[["Sydney Kingsford Smith International Airport"]]}sh-4.2#

主要参数介绍

format

格式化返回结果,摘抄自官网:

format Accept HTTP header Description
Human Readable
csv text/csv Comma-separated values
json application/json JSON (JavaScript Object Notation) human-readable format
tsv text/tab-separated-values Tab-separated values
txt text/plain CLI-like representation
yaml application/yaml YAML (YAML Ain’t Markup Language) human-readable format
Binary Formats
cbor application/cbor Concise Binary Object Representation
smile application/smile Smile binary data format similar to CBOR

分页

如果在查询时,使用了DSL的fetch_size如:

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

其返回中就会有游标:

{"columns": [],"rows": [],"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWWWdrRlVfSS1TbDYtcW9lc1FJNmlYdw==:BAFmBmF1dGhvcgFmBG5hbWUBZgpwYWdlX2NvdW50AWYMcmVsZWFzZV9kYXRl+v///w8="
}

可以通过发送游标进行下一页查询,同时,游标还必须手动进行关闭

POST /_sql/close
{"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWYUpOYklQMHhRUEtld3RsNnFtYU1hQQ==:BAFmBGRhdGUBZgVsaWtlcwFzB21lc3NhZ2UBZgR1c2Vy9f///w8="
}

columnar

是否返回列信息

默认为true,查询返回列信息。

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

结果:

{"columns": [{"name": "author", "type": "text"},{"name": "name", "type": "text"},{"name": "page_count", "type": "short"},{"name": "release_date", "type": "datetime"}],"values": [],"cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWWWdrRlVfSS1TbDYtcW9lc1FJNmlYdw==:BAFmBmF1dGhvcgFmBG5hbWUBZgpwYWdlX2NvdW50AWYMcmVsZWFzZV9kYXRl+v///w8="
}

官方推荐在分页查询第一次查询时返回列信息,后续查询不再返回列信息的方式

其他rest参数

官网链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/sql-rest-fields.html

fetch_size、filter、request_timeout、page_timeout也是会用到的参数。

SQL转DSL

可以通过/_sql/translate进行转换

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

SQL语法、命令

https://www.elastic.co/guide/en/elasticsearch/reference/7.6/sql-spec.html

函数

https://www.elastic.co/guide/en/elasticsearch/reference/7.6/sql-functions.html

限制

https://www.elastic.co/guide/en/elasticsearch/reference/7.6/sql-limitations.html

SQL查询并非ES查询主流,有许多限制需要注意,这里仅将常见的列出来。

  1. 查询返回结果不能过大,会抛出异常ParsingExpection
  2. where和 order by时,scalar函数不能在嵌套字段上使用
  3. 两个不同的结构的嵌套字段不能同时使用
  4. 嵌套字段不能分页
  5. keyword 属性需要常态化
  6. arrary类型不能搜索,可以配置field.multi.value.leniency争取宽大处理
  7. 聚合的排序不支持,将其放在客户端实现,且不允许超过512行
  8. 聚合函数中必须是直接属性,而不能是scalar函数加工的属性
  9. 嵌套子查询的实力只有小学生级别,超出这个范围就不支持了:SELECT X FROM (SELECT ...) WHERE [simple_condition]
  10. 不能在having 中使用FIRST/LAST
  11. TIME类型的属性不可以在GROUP BY / HISTOGRAM中使用
  12. PIVOT中只能接收一个聚合函数

es应用笔记2-sql查询相关推荐

  1. 读书笔记:SQL 查询中的SQL*Plus 替换变量(DEFINE变量)和参数

    本文为"SQL*Plus 替换变量 - 在 SQL 查询中定义变量和参数"的读书笔记. 此文主要是讲替换变量,也称为DEFINE变量,但也涉及了绑定变量和SQL Plus系统变量. ...

  2. 【笔记】SQL查询语句的基本使用方法

    SQL查询语句的基本使用方法 基本查询 SELECT查询语句 --查询所有的学生的学号和姓名 USE JXGL SELECT SNO,SNAME FROM S 简单查询 --查询所有的学生的姓名,学号 ...

  3. sql server查询历史进程_学习笔记 | SequoiaDB SQL查询语句执行过程

    本篇笔记将为大家介绍 SequoiaDB 巨杉数据库查询 SQL 语句的执行过程,以及查询语句执行过程中实例层.协调节点.编码节点.数据节点各自承担的功能. 应用程序或用户想要从数据库查询需要的数据, ...

  4. .Net+SQL Server企业应用性能优化笔记3——SQL查询语句

    在上一篇文章中我们使用了几种方法来确定瓶颈,找到瓶颈,下面再回顾一下: LoadRunner压力测试+Windows计数器,这种方法主要是找出大概的性能问题是在哪台服务器,主要是哪个资源紧张. ANT ...

  5. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  6. 2020-12-03《Presto分布式SQL查询引擎——kkb笔记复习》

    Presto分布式SQL查询引擎 一.课前准备 jdk版本要求:Java 8 Update 151 or higher (8u151+), 64-bit 安装好hadoop集群 安装好hive 二.课 ...

  7. ES中SQL查询详解

    一.Elasticsearch SQL简介 Elasticsearch SQL 是一个 X-Pack 组件,它允许对 Elasticsearch 实时执行类似 SQL 的查询.无论是使用 REST 接 ...

  8. asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02

    本文主要梳理<对比Excel,轻松学习SQL数据分析>对于自己有用的sql知识.这本书中的所有代码和函数均适用于my sql 8.0版本. SQL的基本功能数据定义(DDL)--对数据库, ...

  9. oracle未授权sql查询,【oracle使用笔记3】sql查询遇到的若干问题总结

    在整个开发过程当中,sql查询操做的频率比较高,在不一样的业务场景下会出现不一样的查询需求,如下是我在项目中遇到的查询需求,总结一下.sql [查询一]:取查询出的第一条数据oracle select ...

最新文章

  1. mysql batch insert 遇到错误跳过_mysql 主从复制错误如何跳过
  2. LinkedHashMap的使用
  3. 3分钟看完 Day2 Keynote
  4. 用python庆祝生日_python, 实现朋友家人年历生日自动提醒
  5. [Es] Rejecting mapping update to [xxx] as the final mapping would have more than 1 type [xxx xxx]
  6. Linux下docker的安装及常用命令
  7. 不得罪人 VS 不怕得罪人
  8. 云码之家4年来的微信引流营销推广之路
  9. 云计算(期末复习题含答案)
  10. SONY UP-D898MD 或 UP-X898MD驱动在WIN10 64下的安装
  11. 腾讯广点通DMP广告数据提交回传对接方法解析
  12. Flutter按钮添加背景图片及文字
  13. 用户特殊权限SUID,SGID, SBIT理解学习
  14. twitter推文案例
  15. 如何实现一个朴实无华的Canvas时钟效果
  16. 企业法人如何去申报每个月的个税的呢
  17. mysql全文搜索数字against_Mysql全文搜索match…against的用法
  18. Homebus(HBS)通信协议学习
  19. 服务密码重置_中国移动通信
  20. 深度学习方法——NLLloss简单概括

热门文章

  1. webstorm总是闪退
  2. 浅谈Kube-OVN
  3. win7 制作linux u盘安装教程,win7系统下u盘安装linux centos7,详细步骤,亲测
  4. 微信记录花钱就能查?腾讯回应了
  5. 国内最强的电子计算机专科学校,2021中国电子与计算机工程学专业大学排名 最好的高校排行榜...
  6. 服务器端跳转与客户端跳转
  7. 语音转文字如何操作,这几点方法可以了解一下
  8. 通用功程塑料和改性工程塑料有什么辨别?
  9. Checkpoint checkup中文报告模板使用
  10. 教你使用FLBOOK制作H5电子杂志