Search

Aggregations

Aggregations let you compute analytics over your indexed data — metrics like averages, sums, and statistics, as well as bucket-based groupings like terms, ranges, and histograms.

They are useful when you want to answer questions like:

  • "What is the average price?"
  • "How many unique users do we have?"
  • "How many orders fall into each price range?"
  • "How does traffic change per hour/day?"
const result = await index.aggregate({  aggregations: {    avg_price: { $avg: { field: "price" } },  },});
result = index.aggregate(    aggregations={"avg_price": {"$avg": {"field": "price"}}},)
SEARCH.AGGREGATE products '{}' '{"avg_price": {"$avg": {"field": "price"}}}'

Aggregation requests have two phases:

  1. Document selection: Optional filter selects which documents participate.
  2. Aggregation computation: the selected set is reduced into metric values and/or buckets.

Each aggregation is defined with an alias (the key you choose for the result) and an operator that specifies what to compute.

Response Format

const result = await index.aggregate({  aggregations: {    avg_price: { $avg: { field: "price" } },    by_category: { $terms: { field: "category", size: 5 } },  },});// result is an object keyed by alias:// {//   avg_price: { value: 49.99 },//   by_category: {//     buckets: [//       { key: "electronics", docCount: 42 },//       { key: "clothing", docCount: 31 },//     ],//   },// }
result = index.aggregate(    aggregations={        "avg_price": {"$avg": {"field": "price"}},        "by_category": {"$terms": {"field": "category", "size": 5}},    },)# result is a dict keyed by alias:# {#   "avg_price": {"value": 49.99},#   "by_category": {#     "buckets": [#       {"key": "electronics", "docCount": 42},#       {"key": "clothing", "docCount": 31},#     ],#   },# }
SEARCH.AGGREGATE products '{}' '{"avg_price": {"$avg": {"field": "price"}}, "by_category": {"$terms": {"field": "category", "size": 5}}}'# Response (`redis-cli --json`) is an object keyed by alias:# {"avg_price":{"value":49.99},"by_category":{"buckets":[{"key":"electronics","docCount":42},{"key":"clothing","docCount":31}]}}

Filtering

Use filter to restrict which documents participate in the aggregation.

Filtering uses the same query syntax as queries.

const result = await index.aggregate({  filter: { inStock: true },  aggregations: {    avg_price: { $avg: { field: "price" } },  },});
result = index.aggregate(    filter={"inStock": True},    aggregations={        "avg_price": {"$avg": {"field": "price"}},    },)
SEARCH.AGGREGATE products '{"inStock": true}' '{"avg_price": {"$avg": {"field": "price"}}}'

Multiple Aggregations in One Request

You can compute multiple top-level aggregations in one call by defining multiple aliases under aggregations.

Each alias is computed against the same filtered document set.

const result = await index.aggregate({  aggregations: {    avg_price: { $avg: { field: "price" } },    price_stats: { $stats: { field: "price" } },    by_category: { $terms: { field: "category", size: 5 } },    price_ranges: {      $range: {        field: "price",        ranges: [{ to: 50 }, { from: 50 }],      },    },  },});
result = index.aggregate(    aggregations={        "avg_price": {"$avg": {"field": "price"}},        "price_stats": {"$stats": {"field": "price"}},        "by_category": {"$terms": {"field": "category", "size": 5}},        "price_ranges": {            "$range": {                "field": "price",                "ranges": [{"to": 50}, {"from": 50}],            }        },    },)
SEARCH.AGGREGATE products '{}' '{"avg_price": {"$avg": {"field": "price"}}, "price_stats": {"$stats": {"field": "price"}}, "by_category": {"$terms": {"field": "category", "size": 5}}, "price_ranges": {"$range": {"field": "price", "ranges": [{"to": 50}, {"from": 50}]}}}'

Nested Aggregations

Bucket operators can include sub-aggregations via $aggs, so you can compute per-bucket metrics.

  • $terms, $range, $histogram, and $dateHistogram support nested $aggs.
  • $facet does not support nested $aggs.
  • Metric operators do not support nested $aggs.
const result = await index.aggregate({  aggregations: {    by_category: {      $terms: { field: "category" },      $aggs: {        avg_price: { $avg: { field: "price" } },        min_price: { $min: { field: "price" } },      },    },  },});
result = index.aggregate(    aggregations={        "by_category": {            "$terms": {"field": "category"},            "$aggs": {                "avg_price": {"$avg": {"field": "price"}},                "min_price": {"$min": {"field": "price"}},            },        },    },)
SEARCH.AGGREGATE products '{}' '{"by_category": {"$terms": {"field": "category"}, "$aggs": {"avg_price": {"$avg": {"field": "price"}}, "min_price": {"$min": {"field": "price"}}}}}'

Operator Families

Metric Aggregations

Metric aggregations return numeric summaries.

OperatorTypical use
$avgMean value
$sumTotal
$minSmallest value
$maxLargest value
$countNumber of values
$cardinalityNumber of distinct values
$statsBasic summary stats
$extendedStatsStats + variance/std deviation
$percentilesDistribution cut points

See the metric overview.

Bucket Aggregations

Bucket aggregations partition documents into groups.

OperatorTypical use
$termsTop values by field
$rangeCustom ranges
$histogramFixed numeric bins
$dateHistogramFixed time bins
$facetHierarchical facets

See the bucket overview.

Loading search…