es应用笔记2-sql查询

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: es应用笔记2-sql查询

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' \
>   --compressed
                    Dest
--------------------------------------------
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中只能接收一个聚合函数
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
3天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
25 9
|
23天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
92 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
22天前
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
101 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
22天前
|
SQL 数据挖掘 数据库
SQL自学笔记(2):如何用SQL做简单的检索
本文深入介绍了SQL的基本语法,包括数据查询、过滤、排序、分组及表连接等操作,并通过实际案例展示了SQL在用户研究中的应用,如用户行为分析、用户细分、用户留存分析及满意度调查数据分析。
28 0
SQL自学笔记(2):如何用SQL做简单的检索
|
23天前
|
SQL 数据挖掘 关系型数据库
SQL自学笔记(1):什么是SQL?有什么用?
本文为用户研究新手介绍SQL(结构化查询语言),解释了SQL的基本概念、入门方法及在用户研究中的应用通过实际案例说明,如用户行为分析、用户细分和满意度调查数据分析,展示了SQL在用户研究中的重要作用。
53 0
SQL自学笔记(1):什么是SQL?有什么用?
|
1月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
38 8
|
1月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
59 4
|
1月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
1月前
|
SQL 数据库
如何应用SQL约束条件?
【10月更文挑战第28天】如何应用SQL约束条件?
69 11
|
1月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
153 10