Elasticsearch ESQL 功能限制全面解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
概述
Elasticsearch 的 ESQL (Elasticsearch SQL) 功能为开发者提供了使用 SQL 语法查询 Elasticsearch 数据的能力。然而,作为一个持续演进的功能,ESQL 目前存在一些使用限制和技术约束。本文将全面剖析这些限制,帮助开发者更好地理解和使用 ESQL。
结果集大小限制
ESQL 查询默认返回最多 1000 行结果,这是出于性能考虑设置的默认限制。开发者可以通过 LIMIT
命令将返回行数增加到最多 10,000 行。但需要注意:
- 超过 10,000 行的查询将返回错误
- 大数据集查询可能影响集群性能
- 建议结合分页策略处理大数据集
字段类型支持情况
已支持字段类型
ESQL 目前支持以下核心字段类型:
- 基本类型:
boolean
,null
- 数值类型:
double
(包含 float 系列),int
(包含 short/byte),long
,unsigned_long
(实验性) - 文本类型:
keyword
系列(含 wildcard),text
- 日期时间:
date
- 网络类型:
ip
,version
- 空间类型:
geo_point
,geo_shape
,point
,shape
尚未支持的字段类型
以下类型目前不受支持:
- TSDB 指标类型:
counter
,position
等 - 高级日期类型:
date_nanos
,date_range
- 特殊类型:
binary
,dense_vector
,nested
等
对于不支持的字段类型:
- 直接查询会报错
- 未显式查询的列返回 null 值
- 嵌套字段(nested)完全不返回
部分支持类型的限制
空间类型(geo_point
等)不能用于排序操作,尝试排序会报错。
_source 字段可用性
ESQL 完全依赖 _source
字段,因此:
- 禁用
_source
的索引无法使用 ESQL - 对合成
_source
的支持目前处于实验阶段
全文搜索限制
ESQL 目前不支持传统意义上的全文搜索:
text
字段查询行为类似keyword
字段- 查询是大小写敏感的
- 必须匹配整个字符串
替代方案:
| WHERE field RLIKE "[Ee]lasticsearch.*"
文本字段的特殊行为
ESQL 处理 text
字段时:
- 优先尝试使用其
keyword
子字段 - 若无子字段,则从
_source
获取原始值 - 若
_source
不可用(如合成源),返回 null
注意事项:
- 查询是大小写敏感的
- 子字段可能应用了规范化(normalizer)或截断(ignore_above)
- 建议直接查询明确的
keyword
子字段
时间序列数据流(TSDS)限制
ESQL 目前不支持查询时间序列数据流(TSDS),这是其与常规索引查询的一个重要区别。
日期运算限制
日期数学表达式有以下约束:
-
必须将日期函数(如
now()
)放在最左侧:now() + 1 year - 2hour // 正确
-
以下形式不支持:
1year + now() // 错误 now() + (1year + 2hour) // 错误
-
不支持两个日期相减:
now() - 2023-10-26 // 错误
多值字段限制
ESQL 支持多值字段,但有以下限制:
- 多数函数应用于多值字段时返回 null
- 解决方案是先用多值函数转为单值:
MV_AVG(multivalue_field)
时区支持
目前 ESQL 仅支持 UTC 时区,不支持其他时区设置。
总结
了解这些限制对于有效使用 ESQL 至关重要。虽然某些功能目前受限,但 Elasticsearch 团队正在持续改进 ESQL。开发者应根据实际需求选择合适的数据类型和查询方式,必要时采用推荐的变通方案。随着版本更新,这些限制有望逐步解除。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考