Filter aggregation
editFilter aggregation
editA single bucket aggregation that narrows the set of documents to those that match a query.
Example:
resp = client.search( index="sales", size="0", filter_path="aggregations", aggs={ "avg_price": { "avg": { "field": "price" } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, filter_path: 'aggregations', body: { aggregations: { avg_price: { avg: { field: 'price' } }, t_shirts: { filter: { term: { type: 't-shirt' } }, aggregations: { avg_price: { avg: { field: 'price' } } } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, filter_path: "aggregations", aggs: { avg_price: { avg: { field: "price", }, }, t_shirts: { filter: { term: { type: "t-shirt", }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }, }, }); console.log(response);
POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "avg_price": { "avg": { "field": "price" } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }
The previous example calculates the average price of all sales as well as the average price of all T-shirt sales.
Response:
{ "aggregations": { "avg_price": { "value": 140.71428571428572 }, "t_shirts": { "doc_count": 3, "avg_price": { "value": 128.33333333333334 } } } }
Use a top-level query
to limit all aggregations
editTo limit the documents on which all aggregations in a search run, use a
top-level query
. This is faster than a single filter
aggregation with
sub-aggregations.
For example, use this:
resp = client.search( index="sales", size="0", filter_path="aggregations", query={ "term": { "type": "t-shirt" } }, aggs={ "avg_price": { "avg": { "field": "price" } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, filter_path: 'aggregations', body: { query: { term: { type: 't-shirt' } }, aggregations: { avg_price: { avg: { field: 'price' } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, filter_path: "aggregations", query: { term: { type: "t-shirt", }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }); console.log(response);
POST /sales/_search?size=0&filter_path=aggregations { "query": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }
Instead of this:
resp = client.search( index="sales", size="0", filter_path="aggregations", aggs={ "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, filter_path: 'aggregations', body: { aggregations: { t_shirts: { filter: { term: { type: 't-shirt' } }, aggregations: { avg_price: { avg: { field: 'price' } } } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, filter_path: "aggregations", aggs: { t_shirts: { filter: { term: { type: "t-shirt", }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }, }, }); console.log(response);
POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }
Use the filters
aggregation for multiple filters
editTo group documents using multiple filters, use the
filters
aggregation. This
is faster than multiple filter
aggregations.
For example, use this:
resp = client.search( index="sales", size="0", filter_path="aggregations", aggs={ "f": { "filters": { "filters": { "hats": { "term": { "type": "hat" } }, "t_shirts": { "term": { "type": "t-shirt" } } } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, filter_path: 'aggregations', body: { aggregations: { f: { filters: { filters: { hats: { term: { type: 'hat' } }, t_shirts: { term: { type: 't-shirt' } } } }, aggregations: { avg_price: { avg: { field: 'price' } } } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, filter_path: "aggregations", aggs: { f: { filters: { filters: { hats: { term: { type: "hat", }, }, t_shirts: { term: { type: "t-shirt", }, }, }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }, }, }); console.log(response);
POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "f": { "filters": { "filters": { "hats": { "term": { "type": "hat" } }, "t_shirts": { "term": { "type": "t-shirt" } } } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }
Instead of this:
resp = client.search( index="sales", size="0", filter_path="aggregations", aggs={ "hats": { "filter": { "term": { "type": "hat" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, filter_path: 'aggregations', body: { aggregations: { hats: { filter: { term: { type: 'hat' } }, aggregations: { avg_price: { avg: { field: 'price' } } } }, t_shirts: { filter: { term: { type: 't-shirt' } }, aggregations: { avg_price: { avg: { field: 'price' } } } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, filter_path: "aggregations", aggs: { hats: { filter: { term: { type: "hat", }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }, t_shirts: { filter: { term: { type: "t-shirt", }, }, aggs: { avg_price: { avg: { field: "price", }, }, }, }, }, }); console.log(response);
POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "hats": { "filter": { "term": { "type": "hat" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }