尽管 ES|QL 带来性能及使用上的便捷,在实际的使用中,它还是有一些限制。在今天的文章中,我们来列举它的一些限制。
结果集大小限制
默认情况下,ES|QL 查询最多返回 500 行。 你可以使用 LIMIT 命令将行数增加到最多 10,000 行。 无论 LIMIT 命令的值如何,查询都不会返回超过 10,000 行。
此限制仅适用于查询检索的行数。 查询和聚合在完整数据集上运行。
为了克服这个限制:
- 通过修改查询以仅返回相关数据来减少结果集大小。 使用 WHERE 选择数据的较小子集。
- 将任何查询后处理转移到查询本身。 你可以使用 ES|QL STATS ... BY 命令来聚合查询中的数据。
可以使用这些动态集群设置更改默认和最大限制:
esql.query.result_truncation_default_size
esql.query.result_truncation_max_size
字段类型
支持的类型
ES|QL 目前支持以下字段类型:
alias
boolean
date
double
(float
,half_float
,scaled_float
are represented asdouble
)ip
keyword
family includingkeyword
,constant_keyword
, andwildcard
int
(short
andbyte
are represented asint
)long
null
text
unsigned_long
version
不支持的类型
ES|QL 尚不支持以下字段类型:
-
TSDB metrics
counter
position
aggregate_metric_double
-
Geo/spatial
geo_point
geo_shape
point
shape
-
Date/time
date_nanos
date_range
-
Other types
binary
completion
dense_vector
double_range
float_range
histogram
integer_range
ip_range
long_range
nested
rank_feature
rank_features
search_as_you_type
查询具有不受支持的类型的列会返回错误。 如果查询中未显式使用类型不受支持的列,则返回空值(嵌套字段除外)。 根本不返回嵌套字段。
文本字段的行为类似于关键字字段
虽然 ES|QL 支持 text 字段,但 ES|QL 并不像 Search API 那样处理这些字段。 ES|QL 查询不会查询或聚合已分析的字符串 (analyzed string)。 相反,ES|QL 查询将尝试获取 keyword 族类型的 text 字段的子字段并对其进行查询/聚合。 如果无法检索关键字子字段,ES|QL 将从文档的 _source 获取字符串。 如果无法检索 _source,例如使用合成源时,则返回 null。
请注意,ES|QL 对 keyword 子字段的检索可能会产生意想不到的后果。 文本字段上的 ES|QL 查询区分大小写。 此外,子字段可能已使用规范化器(normalizer)进行映射,该规范化器可以转换原始字符串。 或者它可能已使用 ignore_above 进行映射,这可以截断字符串。 这些映射操作均不会应用于 ES|QL 查询,这可能会导致误报或漏报。
为了避免这些问题,最佳实践是明确你查询的字段,并查询关键字子字段而不是文本字段。
不支持时间序列数据流
ES|QL 不支持查询时间序列数据流(TSDS)。
日期数学限制
当最左边的表达式是日期时间时,日期数学表达式可以很好地工作,例如:
now() + 1 year - 2hour + ...
但并不总是支持使用括号或将日期时间放在右侧。 例如,以下表达式会失败:
1year + 2hour + now()
now() + (1year + 2hour)
日期数学不允许减去两个日期时间,例如:
now() - 2023-10-26
丰富限制
ES|QL ENRICH 命令仅支持 match 类型的丰富策略。 此外,ENRICH 仅支持对 keyword 类型的列进行丰富。
Kibana 限制
- 当 Discover 处于 ES|QL 模式时,不会启用用于过滤数据的用户界面。 要过滤数据,请编写一个使用 WHERE 命令的查询。
- 在 ES|QL 模式下,单击 “Discover” 字段列表中的字段不会显示该字段的快速统计信息。
- Discover 显示的行数不超过 10,000 行。 此限制仅适用于查询检索并显示在 Discover 中的行数。 查询和聚合在完整数据集上运行。
- Discover 显示不超过 50 列。 如果查询返回超过 50 列,Discover 仅显示前 50 列。
- 在没有任何过滤器的情况下一次查询许多索引可能会导致 kibana 出现错误,类似于
[esql] > Unexpected error from Elasticsearch: The content length (536885793) is bigger than the maximum allowed string (536870888)
.。 ES|QL 的响应太长。 使用 DROP 或 KEEP 来限制返回的字段数。