Elasticsearch SQL特性研究

摘要:
您可以使用/_Xpack/sql/translate查看翻译后的DSLPOST/_Xpack/sql/transle{“query”:“format”:“_source”:”sort“:[{“page_count”:”unmapped_type“:不支持INSERT、UPDATE、DELETE、CREATE等语句curl-XPOST-H内容类型:

Elasticsearch SQL特性研究

简介

从Elasticsearch 发布以来,一直有自己的查询语言(DSL),从6.3版本开始,Elasticsearch 开始支持SQL查询语言。即6.3、6.4、6.5、6.6、6.7、7.0均支持SQL查询。但是6.7之前SQL功能是实验性质的,6.6进入beta特性列表,6.7后成为官方正式支持的特性。其中一些SQL相关的API变化较大,各版本间不兼容。SQL查询是Elasticsearch XPack商用插件包中的功能,商用是需要收费的,目前jdbc Driver 只在铂金级的产品上才能用。

概念对应

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

SQL查询的方式

  • 使用PST _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 * FROM library ORDER BY page_count DESC",
    "fetch_size": 10
}

返回

{
    "size" : 10,
    "docvalue_fields" : [
        {
            "field": "page_count",
            "format": "use_field_mapping"
        },
        {
            "field": "release_date",
            "format": "epoch_millis"
        }
    ],
    "_source": {
        "includes": [
            "author",
            "name"
        ],
        "excludes": []
    },
    "sort" : [
        {
            "page_count" : {
                "order" : "desc",
                "missing" : "_first",
                "unmapped_type" : "short"
            }
        }
    ]
}

支持的SQL命令

  • SELECT
    只支持SELECT 查询语句,且不是所有的SELECT 语法结构都支持,不支持INSERT、UPDATE、DELETE、CREATE等语句
curl -X POST -H 'Content-Type: application/json' -i http://localhost:9200/test2/_doc/2 --data '{
   "name":"wangzhen2",
    "info":{"sex":"man","age":28}
}'

查询全部

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

返回数据

   info.age    |   info.sex    |     name      
---------------+---------------+---------------
28             |man            |wangzhen2      
28             |man            |wangzhen  
  • DESCRIBE/DESC/SHOW COLUMNS
    描述一个索引的定义,类似GET /{index}/{type}/_mappings ,查看该索引有多少字段,字段的类型。
curl -X POST -H 'Content-Type: application/json' -i 'http://localhost:9200/_xpack/sql?format=json' --data
'{
    "query": "desc library"
}'

返回

{
  "columns": [{
    "name": "column",
    "type": "keyword"
  }, {
    "name": "type",
    "type": "keyword"
  }, {
    "name": "mapping",
    "type": "keyword"
  }],
  "rows": [
    ["author", "VARCHAR", "text"],
    ["author.keyword", "VARCHAR", "keyword"],
    ["name", "VARCHAR", "text"],
    ["name.keyword", "VARCHAR", "keyword"],
    ["page_count", "BIGINT", "long"],
    ["release_date", "TIMESTAMP", "datetime"]
  ]
}
  • SHOW FUNCTIONS
    展示支持的SQL函数
curl -X POST -H 'Content-Type: application/json' -i 'http://localhost:9200/_xpack/sql?format=json' --data '{
    "query": "show functions"
}'

返回

{
  "columns": [{
    "name": "name",
    "type": "keyword"
  }, {
    "name": "type",
    "type": "keyword"
  }],
  "rows": [
    ["AVG", "AGGREGATE"],
    ["COUNT", "AGGREGATE"],
    ["FIRST", "AGGREGATE"],
    ...
    ]
 }
  • SHOW TABLES
    展示集群中的index 信息
curl -X POST -H 'Content-Type: application/json' -i 'http://localhost:9200/_xpack/sql?format=json' --data
 '{
    "query": "show tables"
}'

返回

{
  "columns": [{
    "name": "name",
    "type": "keyword"
  }, {
    "name": "type",
    "type": "keyword"
  }],
  "rows": [
    ["library", "BASE TABLE"],
    ["test", "BASE TABLE"],
    ["twitter", "BASE TABLE"]
  ]
}

SQL限制

  • nested 类型字段限制

    • DESC/SYSC_COLUMNS 不显示字段内的定义
    • 在查询中不能直接使用该字段,只能使用该字段的子字段
    • 同一个查询中不能引用多个嵌套(nested)字段
    • 包含内嵌字段的分页是不准确的,因为分页是作用在根文档上的,不是内嵌文档
  • 数组字段限制

    • 如果一个字段是数组类型,且包含多个值,用REST接口查询时会抛出异常(field.multi.value.leniency 参数默认是false)
    • 如果一个字段是数组类型,且包含多个值,用JDBC Driver查询时会返回第一个值,但是值的顺序不能保证(field.multi.value.leniency 参数默认是true)
  • 聚合限制

    • 聚合排序(group by a order by b)只能对前512个结果排序,超过这个大小的结果会抛出异常,推荐用limit 限制结果结合大小
    • 聚合函数如 sum、max、mix 只能直接使用在字段上,不能嵌套使用,如SELECT MAX(abs(age)) FROM test
  • 子查询限制

    • 只能支持简单的子查询(比如,这个子查询实际上可以扁平化改写成一个不包含子查询的SELECT 语句)
    • 不支持复杂的子查询
    • 不支持子查询里带有 group by 或者having
  • 不支持在Having 子语句中使用First 或者 Last

免责声明:文章转载自《Elasticsearch SQL特性研究》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何调试 Android 上 HTTP(S) 流量【mysql】:mysql性能优化总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

漂亮的无序列表样式

时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform、WPF、ASP.NET Core等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的、自己会的。 阅读导航: 一、先看效果...

Vue之日历控件vue-full-calendar的使用

(1).安装依赖 npm install vue-full-calendar  npm install moment 因为这是日历插件用到了时间工具类 === moment  (2).文件中导入依赖 在想要用此插件的文件中导入依赖 import { FullCalendar } from 'vue-full-calendar' import "f...

在Linux中samba server的配置

1、查看是否安装samba服务 # rpm –qa |grep samba 2、若没安装,则安 # yum install samba 执行4次此命令 3、查看安装的samba文件 #rpm–qa |grep samba 4、改动配置文件 # vim /etc/samba/smb.conf 注意: A: 做匿名訪问sambaserver——改动例如以下:...

QModelIndex/Role/Model介紹

QModelIndex/Role/Model介紹<二> Model类基本概念在model/view构架中,model为view和delegates使用数据提供了标准接口。在Qt中,标准接口QAbstractItemModel类中被定义。不管数据在底层以何种数据结构存储,QAabstractItemModel的子类会以层次结构的形式来表示数...

有道字典爬虫

有道字典翻译接口: from urllib import request from urllib import response from urllib import parse key = input("请输入要翻译的文字:") formdata = { "action":"FY_BY_REALTIME", "client":"fany...

sqlserver 查询当天/本周/本月/本季度/本年的数据

当天数据:select * from tableName where datediff(day, 字段名,getdate())=0 本周数据:select * from tableName where datediff(week, 字段名,getdate())=0 本月:select * from tableName where datediff(mont...