ES|QL limitations
By default, an ES|QL query returns up to 1000 rows. You can increase the number of rows up to 10,000 using the LIMIT
command. Queries do not return more than 10,000 rows, regardless of the LIMIT
command’s value.
This limit only applies to the number of rows that are retrieved by the query. Queries and aggregations run on the full data set.
To overcome this limitation:
- Reduce the result set size by modifying the query to only return relevant data. Use
WHERE
to select a smaller subset of the data. - Shift any post-query processing to the query itself. You can use the ES|QL
STATS
command to aggregate data in the query.
The default and maximum limits can be changed using these dynamic cluster settings:
esql.query.result_truncation_default_size
esql.query.result_truncation_max_size
ES|QL currently supports the following field types:
alias
boolean
date
date_nanos
(Tech Preview)- The following functions don’t yet support date nanos:
bucket
,date_format
,date_parse
,date_diff
,date_extract
- You can use
to_datetime
to cast to millisecond dates to use unsupported functions
- The following functions don’t yet support date nanos:
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
family includingtext
,semantic_text
andmatch_only_text
[preview]
unsigned_long
version
Spatial types
geo_point
geo_shape
point
shape
ES|QL 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.
ES|QL does not support configurations where the _source field is disabled.
[preview] ES|QL's support for synthetic _source
is currently experimental.
[preview] ES|QL's support for full-text search is currently in Technical Preview. 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. Another limitation is that any WHERE
command containing a full-text search function cannot use disjunctions (OR
), unless:
- All functions used in the OR clauses are full-text functions themselves, or scoring is not used
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")
And this query that uses a disjunction will succeed:
FROM books
| WHERE MATCH(author, "Faulkner") OR QSTR("author: Hemingway")
However using scoring will fail because it uses a non full text function as part of the disjunction:
FROM books METADATA _score
| WHERE MATCH(author, "Faulkner") OR author LIKE "Hemingway"
Scoring will work in the following query, as it uses full text functions on both OR
clauses:
FROM books METADATA _score
| WHERE MATCH(author, "Faulkner") OR QSTR("author: Hemingway")
Note that, because of the way ES|QL 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.
While ES|QL supports text
fields, ES|QL does not treat these fields like the Search API does. ES|QL queries do not query or aggregate the analyzed string. Instead, an ES|QL 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, ES|QL 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 ES|QL's retrieval of keyword
subfields may have unexpected consequences. Other than when explicitly using the full-text functions, MATCH
and QSTR
, any ES|QL 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 ES|QL 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 ES|QL to query multiple indices, ES|QL can execute a single query across multiple indices, data streams, or aliases. However, there are some limitations to be aware of:
- All underlying indexes and shards must be active. Using admin commands or UI, it is possible to pause an index or shard, for example by disabling a frozen tier instance, but then any ES|QL query that includes that index or shard will fail, even if the query uses
WHERE
to filter out the results from the paused index. If you see an error of typesearch_phase_execution_exception
, with the messageSearch rejected due to missing shards
, you likely have an index or shard inUNASSIGNED
state. - The same field must have the same type across all indexes. If the same field is mapped to different types it is still possible to query the indexes, but the field must be explicitly converted to a single type.
ES|QL 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:
- The
geo_match
enrich policy type only supports theintersects
spatial relation. - It is required that the
match_field
in theENRICH
command is of the correct type. For example, if the enrich policy is of typegeo_match
, thematch_field
in theENRICH
command must be of typegeo_point
orgeo_shape
. Likewise, arange
enrich policy requires amatch_field
of typeinteger
,long
,date
, orip
, depending on the type of the range field in the original enrich index. - However, this constraint is relaxed for
range
policies when thematch_field
is of typeKEYWORD
. 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 tonull
, 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.
ES|QL 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.
ES|QL only supports the UTC timezone.
- The user interface to filter data is not enabled when Discover is in ES|QL mode. To filter data, write a query that uses the
WHERE
command instead. - Discover shows no more than 10,000 rows. This limit only applies to the number of rows that are retrieved by the query and displayed in Discover. Queries and aggregations run on the full data set.
- Discover shows no more than 50 columns. If a query returns more than 50 columns, Discover only shows the first 50.
- CSV export from Discover shows no more than 10,000 rows. This limit only applies to the number of rows that are retrieved by the query and displayed in Discover. Queries and aggregations run on the full data set.
- Querying many indices at once without any filters can cause an error in kibana which looks like
[esql] > Unexpected error from Elasticsearch: The content length (536885793) is bigger than the maximum allowed string (536870888)
. The response from ES|QL is too long. UseDROP
orKEEP
to limit the number of fields returned.