navigation_title: "Limitations" mapped_pages:
By default, an {{esql}} query returns up to 1,000 rows. You can increase the number of rows up to 10,000 using the LIMIT
command.
:::{include} _snippets/common/result-set-size-limitation.md :::
{{esql}} currently supports the following field types:
alias
boolean
date
date_nanos
(Tech Preview)
bucket
, date_format
, date_parse
, date_diff
, date_extract
to_datetime
to cast to millisecond dates to use unsupported functionsdouble
(float
, half_float
, scaled_float
are represented as double
)
ip
keyword
family including keyword
, constant_keyword
, and wildcard
int
(short
and byte
are represented as int
)
long
null
text
family including text
, semantic_text
and match_only_text
[preview] unsigned_long
version
Spatial types
geo_point
geo_shape
point
shape
{{esql}} does not yet support the following field types:
TSDB metrics
counter
position
aggregate_metric_double
Date/time
date_range
Other types
binary
completion
dense_vector
double_range
flattened
float_range
histogram
integer_range
ip_range
long_range
nested
rank_feature
rank_features
search_as_you_type
Querying a column with an unsupported type returns an error. If a column with an unsupported type is not explicitly used in a query, it is returned with null
values, with the exception of nested fields. Nested fields are not returned at all.
Some field types are not supported in all contexts:
Spatial types are not supported in the SORT processing command. Specifying a column of one of these types as a sort parameter will result in an error:
geo_point
geo_shape
cartesian_point
cartesian_shape
In addition, when querying multiple indexes, it’s possible for the same field to be mapped to multiple types. These fields cannot be directly used in queries or returned in results, unless they’re explicitly converted to a single type.
{{esql}} does not support configurations where the _source field is disabled.
One limitation of full-text search is that it is necessary to use the search function,
like MATCH
,
in a WHERE
command directly after the
FROM
source command, or close enough to it.
Otherwise, the query will fail with a validation error.
For example, this query is valid:
FROM books
| WHERE MATCH(author, "Faulkner") AND MATCH(author, "Tolkien")
But this query will fail due to the STATS command:
FROM books
| STATS AVG(price) BY author
| WHERE MATCH(author, "Faulkner")
Note that, because of the way {{esql}} treats text
values,
any queries on text
fields that do not explicitly use the full-text functions,
MATCH
,
QSTR
or
KQL
,
will behave as if the fields are actually keyword
fields: they are case-sensitive and need to match the full string.
text
fields behave like keyword
fields [esql-limitations-text-fields]While {{esql}} supports text
fields, {{esql}} does not treat these fields like the Search API does. {{esql}} queries do not query or aggregate the analyzed string. Instead, an {{esql}} query will try to get a text
field’s subfield of the keyword family type and query/aggregate that. If it’s not possible to retrieve a keyword
subfield, {{esql}} will get the string from a document’s _source
. If the _source
cannot be retrieved, for example when using synthetic source, null
is returned.
Once a text
field is retrieved, if the query touches it in any way, for example passing it into a function, the type will be converted to keyword
. In fact, functions that operate on both text
and keyword
fields will perform as if the text
field was a keyword
field all along.
For example, the following query will return a column greatest
of type keyword
no matter whether any or all of field1
, field2
, and field3
are of type text
:
| FROM index
| EVAL greatest = GREATEST(field1, field2, field3)
Note that {{esql}}'s retrieval of keyword
subfields may have unexpected consequences.
Other than when explicitly using the full-text functions,
MATCH
and
QSTR
,
any {{esql}} query on a text
field is case-sensitive.
For example, after indexing a field of type text
with the value Elasticsearch query language
, the following WHERE
clause does not match because the LIKE
operator is case-sensitive:
| WHERE field LIKE "elasticsearch query language"
The following WHERE
clause does not match either, because the LIKE
operator tries to match the whole string:
| WHERE field LIKE "Elasticsearch"
As a workaround, use wildcards and regular expressions. For example:
| WHERE field RLIKE "[Ee]lasticsearch.*"
Furthermore, a subfield may have been mapped with a normalizer, which can transform the original string. Or it may have been mapped with ignore_above
, which can truncate the string. None of these mapping operations are applied to an {{esql}} query, which may lead to false positives or negatives.
To avoid these issues, a best practice is to be explicit about the field that you query,
and query keyword
sub-fields instead of text
fields.
Or consider using one of the full-text search functions.
As discussed in more detail in Using {{esql}} to query multiple indices, {{esql}} can execute a single query across multiple indices, data streams, or aliases. However, there are some limitations to be aware of:
WHERE
to filter out the results from the paused index. If you see an error of type search_phase_execution_exception
, with the message Search rejected due to missing shards
, you likely have an index or shard in UNASSIGNED
state.{{esql}} does not support querying time series data streams (TSDS).
Date math expressions work well when the leftmost expression is a datetime, for example:
now() + 1 year - 2hour + ...
But using parentheses or putting the datetime to the right is not always supported yet. For example, the following expressions fail:
1year + 2hour + now()
now() + (1year + 2hour)
Date math does not allow subtracting two datetimes, for example:
now() - 2023-10-26
While all three enrich policy types are supported, there are some limitations to be aware of:
geo_match
enrich policy type only supports the intersects
spatial relation.match_field
in the ENRICH
command is of the correct type. For example, if the enrich policy is of type geo_match
, the match_field
in the ENRICH
command must be of type geo_point
or geo_shape
. Likewise, a range
enrich policy requires a match_field
of type integer
, long
, date
, or ip
, depending on the type of the range field in the original enrich index.range
policies when the match_field
is of type KEYWORD
. In this case the field values will be parsed during query execution, row by row. If any value fails to parse, the output values for that row will be set to null
, an appropriate warning will be produced and the query will continue to execute.The DISSECT
command does not support reference keys.
The GROK
command does not support configuring custom patterns, or multiple patterns. The GROK
command is not subject to Grok watchdog settings.
{{esql}} supports multivalued fields,
but functions return null
when applied to a multivalued field, unless documented otherwise.
Work around this limitation by converting the field to single value with one of the
multivalue functions.
{{esql}} only supports the UTC timezone.
WHERE
command instead.[esql] > Unexpected error from Elasticsearch: The content length (536885793) is bigger than the maximum allowed string (536870888)
. The response from {{esql}} is too long. Use DROP
or KEEP
to limit the number of fields returned.Refer to Known issues for a list of known issues for {{esql}}.