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