ES|QL functions and operators reference
Complete mapping of ES|QL functions and operators to their Elastic.Esql equivalents. Functions not yet supported are listed at the bottom of each section.
Aggregations run inside .GroupBy(...).Select(...) or as terminal operators like .Count().
See STATS...BY aggregation for details on the GroupBy pattern.
var topLevels = client.CreateQuery<LogEntry>()
.GroupBy(l => l.Level)
.Select(g => new {
Level = g.Key,
Count = g.Count(),
Avg = g.Average(l => l.Duration),
P99 = EsqlFunctions.Percentile(g, l => l.Duration, 99)
});
// STATS count = COUNT(*), avg = AVG(duration), p99 = PERCENTILE(duration, 99) BY level = log.level
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
ABSENT |
EsqlFunctions.Absent(g, x => x.Field) |
|
AVG |
g.Average(x => x.Field) |
|
COUNT |
g.Count() or .Count() |
|
COUNT_DISTINCT |
EsqlFunctions.CountDistinct(g, x => x.Field) |
|
FIRST |
EsqlFunctions.First(g, x => x.Field) |
|
LAST |
EsqlFunctions.Last(g, x => x.Field) |
|
MAX |
g.Max(x => x.Field) |
|
MEDIAN |
EsqlFunctions.Median(g, x => x.Field) |
|
MEDIAN_ABSOLUTE_DEVIATION |
EsqlFunctions.MedianAbsoluteDeviation(g, x => x.Field) |
|
MIN |
g.Min(x => x.Field) |
|
PERCENTILE |
EsqlFunctions.Percentile(g, x => x.Field, 99) |
|
PRESENT |
EsqlFunctions.Present(g, x => x.Field) |
|
SAMPLE |
EsqlFunctions.Sample(g, x => x.Field) |
|
STD_DEV |
EsqlFunctions.StdDev(g, x => x.Field) |
|
SUM |
g.Sum(x => x.Field) |
|
TOP |
EsqlFunctions.Top(g, x => x.Field, n, "asc") |
|
VALUES |
EsqlFunctions.Values(g, x => x.Field) |
|
VARIANCE |
EsqlFunctions.Variance(g, x => x.Field) |
|
WEIGHTED_AVG |
EsqlFunctions.WeightedAvg(g, x => x.Val, x => x.Weight) |
Not yet supported: ST_CENTROID_AGG, ST_EXTENT_AGG.
Conditional logic in projections. The ternary operator maps to CASE WHEN.
.Select(l => new { Status = l.StatusCode >= 500 ? "error" : "ok" })
// EVAL status = CASE WHEN statusCode >= 500 THEN "error" ELSE "ok" END
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
CASE |
condition ? trueVal : falseVal |
|
CLAMP |
EsqlFunctions.Clamp(n, min, max) |
Math.Clamp(n, min, max) |
COALESCE |
EsqlFunctions.Coalesce(a, b) |
|
GREATEST |
Math.Max(a, b) |
|
LEAST |
Math.Min(a, b) |
DateTime properties translate to DATE_EXTRACT. Arithmetic methods like .AddDays() produce date math expressions.
.Where(l => l.Timestamp > DateTime.UtcNow.AddHours(-1) && l.Timestamp.Year == 2025)
// WHERE (@timestamp > (NOW() + -1 hours) AND DATE_EXTRACT("year", @timestamp) == 2025)
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
DATE_DIFF |
EsqlFunctions.DateDiff(unit, start, end) |
|
DATE_EXTRACT |
.Year, .Month, .Day, .Hour, .Minute, .Second, .DayOfWeek, .DayOfYear |
|
DATE_FORMAT |
EsqlFunctions.DateFormat(field, pattern) |
|
DATE_PARSE |
EsqlFunctions.DateParse(pattern, str) |
|
DATE_TRUNC |
EsqlFunctions.DateTrunc(unit, field) |
DateTime.Today |
DAY_NAME |
EsqlFunctions.DayName(date) |
|
MONTH_NAME |
EsqlFunctions.MonthName(date) |
|
NOW |
EsqlFunctions.Now() |
DateTime.Now, DateTime.UtcNow |
TRANGE |
EsqlFunctions.TRange(start, end) |
|
| Date arithmetic | .AddDays(n), .AddHours(n), .AddMinutes(n), .AddSeconds(n), .AddMilliseconds(n) |
|
| Time intervals | TimeSpan.FromDays(n), .FromHours(n), .FromMinutes(n), .FromSeconds(n) |
Grouping uses standard LINQ .GroupBy(). ES|QL-specific grouping functions are available through EsqlFunctions.
See STATS...BY aggregation for the full GroupBy pattern.
.GroupBy(l => EsqlFunctions.Bucket(l.Duration, 10))
.Select(g => new { Bucket = g.Key, Count = g.Count() })
// STATS count = COUNT(*) BY bucket = BUCKET(duration, 10)
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
BUCKET |
EsqlFunctions.Bucket(field, n) or EsqlFunctions.Bucket(field, span) |
|
CATEGORIZE |
EsqlFunctions.Categorize(field) |
|
TBUCKET |
EsqlFunctions.TBucket(field, span) |
using static Elastic.Esql.Functions.EsqlFunctions;
.Where(l => CidrMatch(l.ClientIp, "10.0.0.0/8"))
// WHERE CIDR_MATCH(client_ip, "10.0.0.0/8")
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
CIDR_MATCH |
EsqlFunctions.CidrMatch(ip, cidr) |
|
IP_PREFIX |
EsqlFunctions.IpPrefix(ip, prefixLen, ipVer) |
Standard Math.* methods translate to their ES|QL equivalents in both Where and Select. EsqlFunctions methods also work in both contexts.
.Select(l => new { Abs = Math.Abs(l.Delta), Root = Math.Sqrt(l.Value) })
// EVAL abs = ABS(delta), root = SQRT(value)
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
ABS |
EsqlFunctions.Abs(n) |
Math.Abs(n) |
ACOS |
EsqlFunctions.Acos(n) |
Math.Acos(n) |
ASIN |
EsqlFunctions.Asin(n) |
Math.Asin(n) |
ATAN |
EsqlFunctions.Atan(n) |
Math.Atan(n) |
ATAN2 |
EsqlFunctions.Atan2(y, x) |
Math.Atan2(y, x) |
CBRT |
EsqlFunctions.Cbrt(n) |
Math.Cbrt(n) |
CEIL |
EsqlFunctions.Ceil(n) |
Math.Ceiling(n) |
COPY_SIGN |
EsqlFunctions.CopySign(mag, sign) |
Math.CopySign(mag, sign) |
COS |
EsqlFunctions.Cos(n) |
Math.Cos(n) |
COSH |
EsqlFunctions.Cosh(n) |
Math.Cosh(n) |
E |
EsqlFunctions.E() |
|
EXP |
EsqlFunctions.Exp(n) |
Math.Exp(n) |
FLOOR |
EsqlFunctions.Floor(n) |
Math.Floor(n) |
HYPOT |
EsqlFunctions.Hypot(a, b) |
|
LOG |
Math.Log(n) |
|
LOG10 |
Math.Log10(n) |
|
PI |
EsqlFunctions.Pi() |
|
POW |
Math.Pow(base, exp) |
|
ROUND |
EsqlFunctions.Round(n, decimals) |
Math.Round(n) |
ROUND_TO |
EsqlFunctions.RoundTo(n, dp) |
|
SCALB |
EsqlFunctions.ScaleB(n, exp) |
Math.ScaleB(n, exp) |
SIGNUM |
EsqlFunctions.Signum(n) |
Math.Sign(n) |
SIN |
EsqlFunctions.Sin(n) |
Math.Sin(n) |
SINH |
EsqlFunctions.Sinh(n) |
Math.Sinh(n) |
SQRT |
Math.Sqrt(n) |
|
TAN |
EsqlFunctions.Tan(n) |
Math.Tan(n) |
TANH |
EsqlFunctions.Tanh(n) |
Math.Tanh(n) |
TAU |
EsqlFunctions.Tau() |
Note: Math.E, Math.PI, and Math.Tau are const fields that the C# compiler inlines as numeric literals. Use EsqlFunctions.E(), .Pi(), .Tau() instead to generate the ES|QL function calls.
Full-text search and pattern matching functions available through EsqlFunctions.
using static Elastic.Esql.Functions.EsqlFunctions;
.Where(l => Match(l.Message, "connection error"))
// WHERE MATCH(message, "connection error")
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
DECAY |
EsqlFunctions.Decay(func, field, origin, scale) |
|
KQL |
EsqlFunctions.Kql(query) |
|
MATCH |
EsqlFunctions.Match(field, query) |
|
MATCH_PHRASE |
EsqlFunctions.MatchPhrase(field, phrase) |
|
QSTR |
EsqlFunctions.Qstr(query) |
|
SCORE |
EsqlFunctions.Score() |
|
TOP_SNIPPETS |
EsqlFunctions.TopSnippets(field, n) |
C# string methods translate to ES|QL string functions. Contains, StartsWith, and EndsWith map to LIKE patterns.
.Where(l => l.Host.StartsWith("prod-") && l.Message.ToLower().Contains("timeout"))
// WHERE host LIKE "prod-*" AND TO_LOWER(message) LIKE "*timeout*"
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
BIT_LENGTH |
EsqlFunctions.BitLength(s) |
|
BYTE_LENGTH |
EsqlFunctions.ByteLength(s) |
|
CHUNK |
EsqlFunctions.Chunk(s, size) |
|
CONCAT |
EsqlFunctions.Concat(a, b) |
|
ENDS_WITH |
s.EndsWith("suffix") (via LIKE) |
|
FROM_BASE64 |
EsqlFunctions.FromBase64(s) |
|
HASH |
EsqlFunctions.Hash(algo, s) |
|
LEFT |
EsqlFunctions.Left(s, n) |
|
LENGTH |
EsqlFunctions.Length(s) |
s.Length |
LOCATE |
EsqlFunctions.Locate(s, substr) |
s.IndexOf(substr) |
LTRIM |
EsqlFunctions.Ltrim(s) |
s.TrimStart() |
MD5 |
EsqlFunctions.Md5(s) |
|
REPEAT |
EsqlFunctions.Repeat(s, n) |
|
REPLACE |
EsqlFunctions.Replace(s, old, new) |
s.Replace(old, new) |
REVERSE |
EsqlFunctions.Reverse(s) |
|
RIGHT |
EsqlFunctions.Right(s, n) |
|
RTRIM |
EsqlFunctions.Rtrim(s) |
s.TrimEnd() |
SHA1 |
EsqlFunctions.Sha1(s) |
|
SHA256 |
EsqlFunctions.Sha256(s) |
|
SPACE |
EsqlFunctions.Space(n) |
|
SPLIT |
EsqlFunctions.Split(s, delim) |
s.Split(delim) |
STARTS_WITH |
s.StartsWith("prefix") (via LIKE) |
|
SUBSTRING |
EsqlFunctions.Substring(s, start, len) |
s.Substring(start, len) or s[index] |
TO_BASE64 |
EsqlFunctions.ToBase64(s) |
|
TO_LOWER |
EsqlFunctions.ToLower(s) |
s.ToLower() or s.ToLowerInvariant() |
TO_UPPER |
EsqlFunctions.ToUpper(s) |
s.ToUpper() or s.ToUpperInvariant() |
TRIM |
EsqlFunctions.Trim(s) |
s.Trim() |
URL_DECODE |
EsqlFunctions.UrlDecode(s) |
|
URL_ENCODE |
EsqlFunctions.UrlEncode(s) |
|
URL_ENCODE_COMPONENT |
EsqlFunctions.UrlEncodeComponent(s) |
|
| LIKE pattern | s.Contains("text") |
|
| Null/empty checks | string.IsNullOrEmpty(s), string.IsNullOrWhiteSpace(s) |
All comparison, arithmetic, logical, and pattern-matching operators are fully supported.
| ES|QL | C# |
|---|---|
== |
== |
!= |
!= |
< |
< |
<= |
<= |
> |
> |
>= |
>= |
| ES|QL | C# |
|---|---|
+ |
+ |
- |
- |
* |
* |
/ |
/ |
% |
% |
| ES|QL | C# |
|---|---|
AND |
&& |
OR |
\|\| |
NOT |
! |
using static Elastic.Esql.Functions.EsqlFunctions;
.Where(l => Like(l.Path, "/api/v?/users")) // path LIKE "/api/v?/users"
.Where(l => Rlike(l.Path, "/api/v[0-9]+/.*")) // path RLIKE "/api/v[0-9]+/.*"
.Where(l => levels.Contains(l.Level)) // log.level IN ("a", "b")
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
LIKE |
EsqlFunctions.Like(field, pattern) |
|
RLIKE |
EsqlFunctions.Rlike(field, pattern) |
|
IN |
list.Contains(field) |
|
IS NULL |
EsqlFunctions.IsNull(field) |
field == null |
IS NOT NULL |
EsqlFunctions.IsNotNull(field) |
field != null |
MATCH |
EsqlFunctions.Match(field, query) |
.Select(l => new { IntDuration = EsqlFunctions.CastToInteger(l.Duration) })
// EVAL intDuration = duration::integer
| ES|QL | EsqlFunctions |
C# native |
|---|---|---|
field::integer |
EsqlFunctions.CastToInteger(field) |
|
field::long |
EsqlFunctions.CastToLong(field) |
|
field::double |
EsqlFunctions.CastToDouble(field) |
|
field::boolean |
EsqlFunctions.CastToBoolean(field) |
|
field::keyword |
EsqlFunctions.CastToKeyword(field) |
|
field::datetime |
EsqlFunctions.CastToDatetime(field) |
|
field::ip |
EsqlFunctions.CastToIp(field) |
The following ES|QL function categories have no Elastic.Esql equivalents yet:
Spatial functions: ST_CONTAINS, ST_DISTANCE, ST_DISJOINT, ST_ENVELOPE, ST_INTERSECTS, ST_NPOINTS, ST_SIMPLIFY, ST_WITHIN, ST_X, ST_XMAX, ST_XMIN, ST_Y, ST_YMAX, ST_YMIN, ST_GEOTILE, ST_GEOHEX, ST_GEOHASH.
Multivalue functions: MV_APPEND, MV_AVG, MV_CONCAT, MV_CONTAINS, MV_COUNT, MV_DEDUPE, MV_FIRST, MV_INTERSECTION, MV_INTERSECTS, MV_LAST, MV_MAX, MV_MEDIAN, MV_MEDIAN_ABSOLUTE_DEVIATION, MV_MIN, MV_PERCENTILE, MV_PSERIES_WEIGHTED_SUM, MV_SLICE, MV_SORT, MV_SUM, MV_UNION, MV_ZIP.
Type conversion functions: TO_BOOLEAN, TO_CARTESIANPOINT, TO_CARTESIANSHAPE, TO_DATEPERIOD, TO_DATETIME, TO_DATE_NANOS, TO_DEGREES, TO_DENSE_VECTOR, TO_DOUBLE, TO_GEOHASH, TO_GEOHEX, TO_GEOPOINT, TO_GEOSHAPE, TO_GEOTILE, TO_INTEGER, TO_IP, TO_LONG, TO_RADIANS, TO_STRING, TO_TIMEDURATION, TO_UNSIGNED_LONG, TO_VERSION, TO_AGGREGATE_METRIC_DOUBLE.
Dense vector functions: KNN, TEXT_EMBEDDING, V_COSINE, V_DOT_PRODUCT, V_HAMMING, V_L1_NORM, V_L2_NORM.
Time series aggregation functions: ABSENT_OVER_TIME, AVG_OVER_TIME, COUNT_OVER_TIME, COUNT_DISTINCT_OVER_TIME, DELTA, DERIV, FIRST_OVER_TIME, IDELTA, INCREASE, IRATE, LAST_OVER_TIME, MAX_OVER_TIME, MIN_OVER_TIME, PERCENTILE_OVER_TIME, PRESENT_OVER_TIME, RATE, STDDEV_OVER_TIME, VARIANCE_OVER_TIME, SUM_OVER_TIME.