ES的SQL功能 2020-08-05

声明

es版本号6.8

概念对应

SQL Elasticsearch 对比说明
column field ES尽可能的把字段和SQL中的列做对应,并不是完全对应的上,比如ES中字段可能是一个list
row document document 结构更灵活和松散,row更严格
table index 查询语句执行的对象,理论上table 和index 更加具有可比性,而不是type
schema 无对应关系 SQL中schema是一个table、index 等对象的命名空间,能起到一定的访问控制的作用,ES中没有合适的对应,或者对应上具有安全特性的ES的role概念
database或catalog cluster 实例 SQL中database和catalog大多数情况指的是一个概念,代表schema的集合。ES中cluster是index的集合
cluster cluster、集群联盟 典型的SQL场景中,cluster指的是包含多个database或catalog的单个实例,ES的cluster是真正的运行在多个机器上的分布式节点集群

SQL查询方式

  • 使用POST _xpack/sql?format=txt 或者_sql?format=txt(7.0后)API

    • format 支持 txt ,以表格方式返回数据
    • format 支持josn ,以json格式返回数据
    • format支持其他格式,如csv、yaml、cbor、smile
  • 使用es命令行工具 /bin/elasticsearch-sql-cli

  • 使用jdbc Driver 或者odbc Driver (铂金级产品才能用)

SQL查询的本质

_sql API 本质上是一个翻译者的角色,把SQL翻译成了DSL语句给ES去执行,可以通过 /_xpack/sql/translate 查看翻译后的DSL

POST /_xpack/sql/translate
{
    "query": "select \"@timestamp\",application.keyword,cs_uri_query,elapsed_time,requested_uri,server_ip from \"accesslog-car-api-2020-08-05\" where application.keyword = 'car-web-pc-api' and requested_uri.keyword = '/pc/web/api/v1/getrecommendserialbyserialid' and elapsed_time >= 100 order by elapsed_time desc",
    "fetch_size": 10
}

返回

{
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : [
        {
          "bool" : {
            "must" : [
              {
                "term" : {
                  "application.keyword" : {
                    "value" : "car-web-pc-api",
                    "boost" : 1.0
                  }
                }
              },
              {
                "term" : {
                  "requested_uri.keyword" : {
                    "value" : "/pc/web/api/v1/getrecommendserialbyserialid",
                    "boost" : 1.0
                  }
                }
              }
            ],
            "adjust_pure_negative" : true,
            "boost" : 1.0
          }
        },
        {
          "range" : {
            "elapsed_time" : {
              "from" : 100,
              "to" : null,
              "include_lower" : true,
              "include_upper" : false,
              "boost" : 1.0
            }
          }
        }
      ],
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "_source" : {
    "includes" : [
      "cs_uri_query",
      "requested_uri",
      "server_ip"
    ],
    "excludes" : [ ]
  },
  "docvalue_fields" : [
    {
      "field" : "@timestamp",
      "format" : "epoch_millis"
    },
    {
      "field" : "application.keyword",
      "format" : "use_field_mapping"
    },
    {
      "field" : "elapsed_time",
      "format" : "use_field_mapping"
    }
  ],
  "sort" : [
    {
      "elapsed_time" : {
        "order" : "desc",
        "missing" : "_first",
        "unmapped_type" : "long"
      }
    }
  ]
}

支持的SQL命令

  • SELECT
    只支持SELECT 查询语句,且不是所有的SELECT 语法结构都支持,不支持INSERT、UPDATE、DELETE、CREATE等语句

查询方式一:

POST /_xpack/sql?format=txt
{
    "query": "select \"@timestamp\",application.keyword,cs_uri_query,elapsed_time,requested_uri,server_ip from \"accesslog-car-api-2020-08-05\" where application.keyword = 'car-web-pc-api' and requested_uri.keyword = '/pc/web/api/v1/getrecommendserialbyserialid' and elapsed_time >= 100 order by elapsed_time desc",
    "fetch_size": 10
}

返回数据

       @timestamp       |application.keyword| cs_uri_query  | elapsed_time  |               requested_uri               |   server_ip   
------------------------+-------------------+---------------+---------------+-------------------------------------------+---------------
2020-08-05T02:18:36.114Z|car-web-pc-api     |serialId=1987  |176            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T07:03:32.249Z|car-web-pc-api     |serialId=6044  |164            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T00:17:41.124Z|car-web-pc-api     |serialId=4452  |162            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T01:30:00.670Z|car-web-pc-api     |serialId=5642  |161            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T09:22:55.332Z|car-web-pc-api     |serialId=6188  |160            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.41.88   
2020-08-05T07:34:42.856Z|car-web-pc-api     |serialId=4854  |158            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T07:12:41.605Z|car-web-pc-api     |serialId=5772  |156            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.41.88   
2020-08-05T03:47:10.815Z|car-web-pc-api     |serialId=5217  |154            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  
2020-08-05T07:56:34.936Z|car-web-pc-api     |serialId=3901  |154            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.41.88   
2020-08-05T07:20:34.482Z|car-web-pc-api     |serialId=2120  |153            |/pc/web/api/v1/getrecommendserialbyserialid|10.244.42.194  

查询方式二:

curl -X POST -H 'Content-Type: application/json' -i 'http://192.168.87.203:9200/_xpack/sql?format=txt' --data '{
  "query":"select * from test2"
}'

返回数据:

HTTP/1.1 200 OK
Took-nanos: 20477000
Warning: 299 Elasticsearch-7.3.1-4749ba6 "[POST /_xpack/sql] is deprecated! Use [POST /_sql] instead."
content-type: text/plain
content-length: 144

   info.age    |   info.sex    |     name
---------------+---------------+---------------
28             |man            |wangzhen2

那如果要进行模糊搜索呢,Elasticsearch 的搜索能力大家都知道,强!在 SQL 里面,可以用 match 关键字来写,如下:

//不好使
POST /_xpack/sql?format=txt
{
    "query": "SELECT * FROM test2 WHERE match(info.sex, 'ma')"
}
  • DESCRIBE/DESC/SHOW COLUMNS
    描述一个索引的定义,类似GET /{index}/{type}/_mappings ,查看该索引有多少字段,字段的类型。
//方式一
POST /_xpack/sql?format=txt
{
    "query": "desc test2"
}

//方式二
POST /_xpack/sql?format=txt
{
    "query": "SHOW COLUMNS IN test2"
}

返回

#! Deprecation: [POST /_xpack/sql] is deprecated! Use [POST /_sql] instead.
     column     |     type      |    mapping    
----------------+---------------+---------------
info            |STRUCT         |object         
info.age        |BIGINT         |long           
info.sex        |VARCHAR        |text           
info.sex.keyword|VARCHAR        |keyword        
name            |VARCHAR        |text           
name.keyword    |VARCHAR        |keyword        

  • SHOW FUNCTIONS
    展示支持的SQL函数
POST /_xpack/sql?format=txt
{
    "query": "SHOW FUNCTIONS"
}

//支持通配符
POST /_xpack/sql?format=txt
{
    "query": "SHOW FUNCTIONS 'S__'"
}

返回:

#! Deprecation: [POST /_xpack/sql] is deprecated! Use [POST /_sql] instead.
      name       |     type      
-----------------+---------------
AVG              |AGGREGATE      
COUNT            |AGGREGATE      
FIRST            |AGGREGATE      
FIRST_VALUE      |AGGREGATE      
LAST             |AGGREGATE      
LAST_VALUE       |AGGREGATE      
MAX              |AGGREGATE      
MIN              |AGGREGATE      
SUM              |AGGREGATE      
KURTOSIS         |AGGREGATE      
MAD              |AGGREGATE      
PERCENTILE       |AGGREGATE      
PERCENTILE_RANK  |AGGREGATE      
SKEWNESS         |AGGREGATE      
STDDEV_POP       |AGGREGATE      
SUM_OF_SQUARES   |AGGREGATE      
VAR_POP          |AGGREGATE      
HISTOGRAM        |GROUPING 
...
  • SHOW TABLES
    展示集群中的index 信息
POST /_xpack/sql?format=txt
{
    "query": "SHOW tables"
}

//支持通配符
POST /_xpack/sql?format=txt
{
    "query": "SHOW TABLES 'twit%'"
}

POST /_xpack/sql?format=txt
{
    "query": "SHOW TABLES 'twitte_'"
}

返回:

#! Deprecation: [POST /_xpack/sql] is deprecated! Use [POST /_sql] instead.
            name            |     type      |     kind      
----------------------------+---------------+---------------
.kibana                     |VIEW           |ALIAS          
.kibana_1                   |BASE TABLE     |INDEX          
.kibana_task_manager        |BASE TABLE     |INDEX          
ecommerce                   |VIEW           |ALIAS          
flights                     |VIEW           |ALIAS          
kibana_sample_data_ecommerce|BASE TABLE     |INDEX          
kibana_sample_data_flights  |BASE TABLE     |INDEX          
kibana_sample_data_logs     |BASE TABLE     |INDEX          
lead                        |BASE TABLE     |INDEX          
logstash                    |VIEW           |ALIAS          
logstash-2019.10.30-000001  |BASE TABLE     |INDEX          
logstash-2019.11.29-000002  |BASE TABLE     |INDEX          
logstash-2019.12.29-000003  |BASE TABLE     |INDEX          
logstash-2020.01.28-000004  |BASE TABLE     |INDEX          
logstash-2020.02.27-000005  |BASE TABLE     |INDEX          
logstash-2020.03.28-000006  |BASE TABLE     |INDEX          
logstash-2020.05.08-000007  |BASE TABLE     |INDEX          
logstash-2020.06.07-000008  |BASE TABLE     |INDEX          
logstash-2020.07.07-000009  |BASE TABLE     |INDEX          
monitor_1                   |BASE TABLE     |INDEX          
my_index                    |BASE TABLE     |INDEX          
test2                       |BASE TABLE     |INDEX          

最后一个小贴士,如果你的索引名称包含横线,如 logstash-201811,只需要做一个用双引号包含,对双引号进行转义即可,如下:

POST /_xpack/sql?format=txt
{
"query":"SELECT COUNT(*) FROM \"logstash-*\""
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容