Elasticsearch SQL特性

Elasticsearch从6.3版本开始支持SQL查询语言,SQL查询是Elasticsearch XPack商用插件包中的功能。

sql查询方式: post http://127.0.0.1:9200/_sql?format=json

SQL查询的本质

把SQL翻译成了DSL,只支持SELECT 查询语句

POST /_xpack/sql/translate
{
    "query": "SELECT * FROM library ORDER BY page_count DESC",
    "fetch_size": 10
}

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 限制结果结合大小(没有排序的查询不受512个结果的影响,但默认值是10000)
    • 聚合函数如 sum、max、mix 只能直接使用在字段上,不能嵌套使用,如SELECT MAX(abs(age)) FROM test
  • 子查询限制
    • 只能支持简单的子查询(比如,这个子查询实际上可以扁平化改写成一个不包含子查询的SELECT 语句)
    • 不支持复杂的子查询
    • 不支持子查询里带有 group by 或者having
  • 不支持在Having 子语句中使用First 或者 Last
发表评论

相关文章

猜你喜欢