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

相关推荐
python资深爱好者25 分钟前
什么容错性以及Spark Streaming如何保证容错性
大数据·分布式·spark
ChinaRainbowSea37 分钟前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
B站计算机毕业设计超人2 小时前
计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
大数据·hadoop·爬虫·深度学习·机器学习·数据可视化·推荐算法
qiquandongkh2 小时前
2025年股指期货和股指期权合约交割的通知!
大数据·金融·区块链
Ray.19983 小时前
优化 Flink 消费 Kafka 数据的速度:实战指南
大数据·flink·kafka
D愿你归来仍是少年3 小时前
Python解析 Flink Job 依赖的checkpoint 路径
大数据·python·flink
RainbowSea3 小时前
4. MySQL 逻辑架构说明
数据库·sql·mysql
飞火流星020274 小时前
ElasticSearch公共方法封装
elasticsearch·搜索引擎·es鉴权·es代理访问·es公共方法封装·es集群访问·判断es索引是否存在
说私域4 小时前
利用开源AI智能名片2+1链动模式S2B2C商城小程序构建企业私域流量池的策略与实践
大数据·人工智能·小程序·开源
vvvae12344 小时前
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
elasticsearch