es 3期 第24节-运用SQL简化DSL查询

1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。

2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!

3.Elasticsearch原则上适合一切非事务性应用场景或能够容许一定的延迟的事务性场景;能最大限度的替代mongodb与传统关系型数据库

索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
对历史数据无效!!!!
一定要重建索引!!!!

1、ESSOL概要介绍SOL需求背景

###SOL需求背景

DSL难于掌握,语法过于复杂

SOL拥有广大的群众基础,便于推广

ES-JDBC能力,便于与其它JDBC混搭

SOL是大数据产品的标配

早期基于NLPChina插件实现

SQL -> DSL -> 执行

SQL概念映射

数据库与ES概念映射Elasticsearch

sql Elasticsearch

数据列 column 字段 field

数据行 row 数据文档 document

数据表 table 索引index

表结构 schema 映射 mapping

数据库 database ES集群 cluster

SQL执行接口

SQL执行接口执行接口,执行SOL语言表达式

GET _sql

2、SOL常用查询

查询参数

_sql,执行sql查询 API

format,返回结果的格式化,支持多种,默认ison

query,执行SOL脚本输入

复制代码
# dsl查询方式
GET kibana_sample_data_flights/_search
{
  "track_total_hits":true,
  "size":1
}
# sql查询方式
GET _sql
{
  "query":"""
    select * from "kibana_sample_data_flights"
  """
}

通过对比结果发现

dsl每条数据都是json格式,包含了key/value

sql类似于excel,columns单独返回了表头,rows中只有value,数据包减小了,可以作为性能优化点

返回1条数据和指定字段

复制代码
GET _sql?format=json
{
  "query":"""
    select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
  """
}

format 内容格式

支持多种响应格式,默认 Json

查询参数

参数说明

json 默认 ,相比原有 dsl-json 大大减少资源

csv Excel 表格,分隔符

tsv

txt 文本

yaml

cbor 二进制编码

smile 二进制编码

csv格式

复制代码
# csv格式
GET _sql?format=csv
{
  "query":"""
    select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
  """
}
# yaml格式
GET _sql?format=yaml
{
  "query":"""
    select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
  """
}

SQL 分页

SOL执行查询下,分页采用的是快照方式,基于游标

查询参数

fetch_size,分页大小,默认 1000

分页查询,注意返回结果中的cursor,cursor相当于游标,用于翻页

复制代码
GET _sql
{
  "query":"""
    select * from "kibana_sample_data_flights"
  """,
  "fetch_size": 2
}

使用cursor翻页,每次都要重新获取上一次结果的cursor作为下一页的入参

复制代码
GET _sql
{"cursor": "i/vrA0RGTACEVMty2jAUlVwohYRkptss+gVdQNPpZGkwhCTFFAKYeOMRlrAVhMXYIgz/1UX/LpVsEyxCp9pY99yr+5DOMXQBDIEBgVqvcl2mOyAhWFtQwrCX8FiUPMz91yxKLfgbfgCGITfp0bLcpassEZUFXl2YL8GY+ksifsXUJ8CotlHkE8YIBkaljeKYkhgYJYskAhh19TFpvJa17ixgnCu7TcXORit59iw1+SYS8S53/uQ+EpRHwKgp54gEqZFGOgSJUGX/bNFEqLIPlPEVESROVK0c7FNGpH3WZTQIhUUYkskvClafyoyXBWC8W6tJMsTerN7Cx3RFenwjS9YzpwLS4x8HMQ3SPNmmMORFhhzGrOfAftA84DDqeRawHzaPfxu3itFusHAIWcomhexADr9awy+JkE8gPIwE8fha3RpinvJ7EYp4YsA/kHovsbntINRk9Mn5Hs6+2eF81krc6c3yaTYKZ003QQ7muNd30G2j50/X4bgRjvD4/sGdjPpO52bQn7nJZGg6w6bbmDt2H3fuH+2OL3BjaqFbvPUtNsBbM19f0Y+Wa82du63btVuD6SgkE/t6OA4f58+ta7Lsjkyz879aJqjltL2CiyPKwfKCcSQkIxcH7sHKnHNGUKTgPQ1hZUl2Wx5jBaaM1BCdnJpL46nmKVL2/ZH9k8JqQLi35jRK+yxQ+X2y/Jk1xwmCF8bWmV5wFCmv3cgR+2FFNkYCKSXZ3LEQtEYOmtDgPN9eHvq1akopdJdLRgs+Vo9eRReSXkXT1Klj/3gLTWunUp56j4MCtasriPGTUqHSHgAl+aOsAPAXAAD//wMA"
}

结果行转列

在部分场景下,我们需要提取数据按照列示的方式,可以减少转换

ES 默认情况下,类数据全部是按照行式返回的

目前限定 format格式必须是json/yaml才可以

查询参数

columnar,取值范围 true/false

columnar行转列,查询目的地城市名

复制代码
GET _sql
{
  "query":"""
    select DestCityName from "kibana_sample_data_flights"
  """,
  "fetch_size": 2,
  "columnar":true
}

默认的,查询目的地城市名,对比两或者差异

复制代码
GET _sql
{
  "query":"""
    select DestCityName from "kibana_sample_data_flights"
  """,
  "fetch_size": 2
}

查询过滤条件参数化

ES 提供的 SOL查询近可能的靠近 SOL的表达能力,但与标准的SOL还是有点差距

查询参数

params,提供参数化

sql中入参

复制代码
GET _sql
{
  "query":"""
    select * from "kibana_sample_data_flights" where DestCountry='CN'
  """,
  "fetch_size": 2
}

占位符参数

复制代码
GET _sql
{
  "query":"""
    select * from "kibana_sample_data_flights" where DestCountry=?
  """,
  "fetch_size": 2,
  "params":["CN"]
}

SOL与 DSL混合限制查询

SOL执行查询时,也可以基于 DSL编写限制过滤条件

查询参数

filter,限制条件查询关键字表达式

dsl查询方式

复制代码
GET kibana_sample_data_flights/_search
{
  "track_total_hits":true,
  "size":1,
  "query":{
    "bool": {
      "filter": [
        {
          "term": {
            "DestCountry": "CN"
          }
        }
      ]
    }
  }
}

混合查询方式

复制代码
GET _sql
{
  "query": """
    select * from "kibana_sample_data_flights"
  """,
  "fetch_size": 2,
  "filter": {
    "term": {
      "DestCountry": "CN"
    }
  }
}

sql 翻译成 dsl

复制代码
GET _sql/translate
{
  "query":"""
    select DestCityName,DistanceMiles from "kibana_sample_data_flights" where DestCountry='CN'
  """,
  "fetch_size": 2
}

使用上面的返回结果查询

复制代码
GET kibana_sample_data_flights/_search
{
  "size": 2,
  "query": {
    "term": {
      "DestCountry": {
        "value": "CN"
      }
    }
  },
  "_source": false,
  "fields": [
    {
      "field": "DestCityName"
    },
    {
      "field": "DistanceMiles"
    }
  ],
  "sort": [
    {
      "_doc": {
        "order": "asc"
      }
    }
  ],
  "track_total_hits": -1
}

常用 SQL

SQL语法

SQL查询语法几乎与常用的 SOL标准是一样的

查询语法

SELECT [TOP [ count ]]select_expr [, ...]

FROM table name.

[WHERE condition ]

[ GROUP BY grouping _element [,..]]

[ HAVING condition]

# [ORDER BY expression [ASC DESC ][,...]]

[ LIMIT [count ]]

[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ][, ..] ))]

精确查询

dsl查询方式

复制代码
GET kibana_sample_data_flights/_search
{
  "track_total_hits":true,
  "size":1,
  "query":{
    "bool": {
      "filter": [
        {
          "term": {
            "DestCountry": "CN"
          }
        }
      ]
    }
  }
}

sql

复制代码
GET _sql
{
  "query":"""
    select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights" where DestCountry='CN'
  """,
  "fetch_size": 2
}

分词查询

复制代码
GET kibana_sample_data_flights_3share/_mappings

dsl查询方式, 使用kibana_sample_data_flights_3share索引

复制代码
GET kibana_sample_data_flights_3share/_search
{
  "track_total_hits": true,
  "size": 1,
  "query": {
    "match": {
      "Dest": "International"
    }
  }
}

sql 分词,注意排序与dsl不同,最好加order by

复制代码
GET _sql
{
  "query":"""
    select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights_3share" where match(Dest,'International')
  """,
  "fetch_size": 2
}

sql 常用聚合

指标聚合、分桶聚合、管道聚合、混合聚合

avg,dsl查询方式

复制代码
GET kibana_sample_data_flights/_search
{
  "track_total_hits":true,
  "size":0,
  "aggs":{
    "avg_FlightTimeMin":{
      "avg": {
        "field": "FlightTimeMin"
      }
    }
  }
}

avg,sql查询方式

复制代码
GET _sql
{
  "query":"""
    select avg(FlightTimeMin) from "kibana_sample_data_flights"
  """
}

分组聚合,dsl方式

复制代码
GET kibana_sample_data_flights/_search
{
  "track_total_hits": true,
  "size": 0,
  "aggs": {
    "trems_DestCountry": {
      "terms": {
        "field": "DestCountry",
        "size": 100,
        "order": {
          "_key": "asc"
        }
      },
      "aggs": {
        "stats_FlightTimeMin": {
          "stats": {
            "field": "FlightTimeMin"
          }
        }
      }
    }
  }
}

分组聚合,sql查询方式

复制代码
GET _sql
{
  "query":"""
    select avg(FlightTimeMin) as avg, max(FlightTimeMin) as max, min(FlightTimeMin) as min, DestCountry from "kibana_sample_data_flights" group by DestCountry
  """
}

3、SOL高级查询

查询所有索引

复制代码
GET _cat/indices
GET _sql
{
  "query":"""
  show tables
  """
}

查询支持的函数

复制代码
GET _sql
{
  "query":"""
  show functions
  """
}

查询所有列

复制代码
GET _sql
{
  "query":"""
  show columns in "kibana_sample_data_flights"
  """
}
GET _sql
{
  "query":"""
  describe "kibana_sample_data_flights"
  """
}

时间函数

复制代码
GET _sql
{
  "query":"""
    select CURRENT_DATE(),CURRENT_DATE,CURRENT_TIME(),CURRENT_TIME,CURRENT_TIMESTAMP
(),CURRENT_TIMESTAMP,DATEADD('year',1,CURRENT_DATE)
 """
}

case

复制代码
GET _sql
{
  "query":"""
    SELECT CASE 3
    WHEN 1 THEN 'one'
    WHEN 3 THEN 'three'
    WHEN 5 THEN 'five'
    END AS "case"
 """
}

SQL 函数

全文文本函数

ESSOL全文检索与标准 SOL有差异,采用定制函数的方式实现

MATCH,查询函数关键字

查询出发地国家包括"CN"的航班信息

复制代码
GET _sql
{
  "query":"""
    select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights_3share" where match(DestCountry,'CN')
  """,
  "fetch_size": 2
}

常用聚合函数

AVG,SUM ,MIN,MAXCOUNT

FIRST, LAST, FIRST_VALUE, LAST_VALUE

提取航班信息中,第一个出发地国家,最后一个出发地国家

复制代码
GET _sql
{
  "query":"""
    select FIRST(DestCountry) as first, FIRST_VALUE(DestCountry) FIRST_VALUE,LAST(DestCountry) as last, min(FlightTimeMin) as min from "kibana_sample_data_flights"
  """
}

统计类聚合函数

PERCENTILE, PERCENTILE_RANK

其它聚合统计函数,查阅官方网站

基于百分位占比,统计航班信息中飞行时间长百分位占比;第1个,统计第95 百分位的飞行时间平均时间;第2个,统计飞行时间为 700的百分位占比

复制代码
GET _sql
{
  "query":"""
    select PERCENTILE(FlightTimeMin,95), PERCENTILE_RANK(FlightTimeMin,700) from "kibana_sample_data_flights"
  """
}

分桶类聚合函数

HISTOGRAM,直方图统计函数,必须带上group关键字

按照飞行时间统计所有航班信息,按照100 间隔;此处对比结果,并没有 DSL表达能力好

复制代码
GET _sql
{
  "query":"""
    select HISTOGRAM(FlightTimeMin,100) as h,count(0) from "kibana_sample_data_flights" group by h
  """
}

数学函数

ESSOL支持很多数学函数

ABS

绝对值查询,去掉负数;对比 DSL没有此功能,需要通过脚本的机制转换

复制代码
GET _sql
{
  "query":"""
    select abs(-10)
  """
}

SQL操作符

条件比对、逻辑条件、数学计算、Like模糊查询

SQL限制性

类型限制:数组类型不支持

ESSQL并非完全支持标准SOL,很多SOL独有的功能不具备;

DSL表达能力很丰富,SOL无法实现;

4、JDBC与BI报表可视化

JDBC应用

JDBC应用配置JDBC驱动,客户端工具可直接连接或者Java代码可直接访问。

JDBC客户端

Dbeaver

Java代码

ES-SQL-CLI工具

tips:

1、需要授权使用;

2、不支持insert;

BI报表可视化

Tableau

BI可视化

基于jdbc直接可以集成报表工具,满足BI需求

Qlik sense

BI可视化

基于idbc直接可以集成报表工具,满足B1需求

5、SOL实战建议与经验分享

简单查询场景尽量使用SQL

DSL依然是最强大的领域搜索语言SOL目前无法完全取代DSL

SOL查询比DSL查询更适合应用(报头小)

SQL自身局限性

6、PrestoDB查询引擎

架构概要

支持连表

Prestodb数据源

支持数据源

1.支持同时配置多个不同集群ES数据源

2.支持同时配置多个不同版本的ES数据源

Prestodb查询

复杂查询

1.基于Prestodb引擎支持关联Join查询、支持多级嵌套查询

2.支持跨多个ES数据源中心查询

es-sql 官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/8.6/xpack-sql.html

sql-spec 语言语法

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

sql-functions 函数操作符

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

sql-limitations 限制条件

https://www.elastic.co/guide/en/elasticsearch/reference/current/sgl-limitations.html

sql-client-apps 客户端工具

https://www.elastic.co/guide/en/elasticsearch/reference/8.6/sgl-client-apps.html

elasticsearch-sql 三方开源支持

https://github.com/NLPchina/elasticsearch-sql

dbeaver 官方下载

https://dbeaver.io

prestodb 官方参考

https://prestodb.io/docs/current

prestodb-elasticsearch 连接器配置

https://prestodb.io/docs/current/connector/elasticsearch.html

相关推荐
青稞社区.1 小时前
Claude Code 源码深度解析:运行机制与 Memory 模块详解
大数据·人工智能·elasticsearch·搜索引擎·agi
T06205141 小时前
【面板数据】地级市及区县人口空心化数据(2000-2024年)
大数据
Aktx20FNz2 小时前
iFlow CLI 完整工作流指南
大数据·elasticsearch·搜索引擎
LaughingZhu3 小时前
Anthropic 收购 Oven 后,Claude Code 用运行时写了一篇护城河文章
大数据·人工智能·经验分享·搜索引擎·语音识别
学习3人组3 小时前
TortoiseGit冲突解决实战上机练习
大数据·elasticsearch·搜索引擎
Ln5x9qZC23 小时前
Flink SQL 元数据持久化实战
大数据·sql·flink
OYpBNTQXi3 小时前
Flink Agents 源码解读 --- (6) --- ActionTask
大数据·flink
A__tao4 小时前
Elasticsearch Mapping 一键生成 Go Struct,支持嵌套解析
elasticsearch·es
中金快讯4 小时前
济民健康医疗服务占比提升至46%!业务结构调整初见成效
大数据·人工智能
lizhihai_994 小时前
股市学习心得-尾盘半小时买入法
大数据