From c11952eb7caf92d73d2d4e6b01d93be7b64b7411 Mon Sep 17 00:00:00 2001 From: Pascal Seitz Date: Mon, 27 Apr 2026 16:46:04 +0200 Subject: [PATCH] add order by agg benchmark --- benches/agg_bench.rs | 65 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/benches/agg_bench.rs b/benches/agg_bench.rs index 28009fa3f..bbaed46a8 100644 --- a/benches/agg_bench.rs +++ b/benches/agg_bench.rs @@ -81,6 +81,11 @@ fn bench_agg(mut group: InputGroup) { register!(group, cardinality_agg); register!(group, terms_status_with_cardinality_agg); register!(group, terms_100_buckets_with_cardinality_agg); + register!(group, terms_many_with_single_term_order_by_cardinality_agg); + register!( + group, + terms_many_with_nested_terms_double_order_by_cardinality_agg + ); register!(group, range_agg); register!(group, range_agg_with_avg_sub_agg); @@ -200,6 +205,60 @@ fn terms_100_buckets_with_cardinality_agg(index: &Index) { execute_agg(index, agg_req); } +fn terms_many_with_single_term_order_by_cardinality_agg(index: &Index) { + let agg_req = json!({ + "my_texts": { + "terms": { "field": "text_many_terms" }, + "aggs": { + "nested_terms": { + "terms": { + "field": "single_term", + "order": { "cardinality": "desc" } + }, + "aggs": { + "cardinality": { + "cardinality": { "field": "text_many_terms" } + } + } + } + } + }, + }); + execute_agg(index, agg_req); +} + +// Two-level terms ordered by cardinality at each level: a high-card outer terms +// (text_many_terms) ordered by a cardinality sub-agg, with a nested low-card terms +// (text_few_terms_status) also ordered by a cardinality sub-agg, plus an avg. +fn terms_many_with_nested_terms_double_order_by_cardinality_agg(index: &Index) { + let agg_req = json!({ + "by_ip": { + "terms": { + "field": "text_many_terms", + "size": 50, + "order": { "distinct_path": "desc" } + }, + "aggs": { + "distinct_path": { + "cardinality": { "field": "text_few_terms" } + }, + "by_asn": { + "terms": { + "field": " single_term", + "size": 10, + "order": { "distinct_path2": "desc" } + }, + "aggs": { + "avg_botscore": { "avg": { "field": "score" } }, + "distinct_path2": { "cardinality": { "field": "text_few_terms" } } + } + } + } + } + }); + execute_agg(index, agg_req); +} + fn terms_7(index: &Index) { let agg_req = json!({ "my_texts": { "terms": { "field": "text_few_terms_status" } }, @@ -609,7 +668,8 @@ fn get_test_index_bench(cardinality: Cardinality) -> tantivy::Result { TextFieldIndexing::default().set_index_option(IndexRecordOption::WithFreqs), ) .set_stored(); - let text_field = schema_builder.add_text_field("text", text_fieldtype); + let text_field = schema_builder.add_text_field("text", text_fieldtype.clone()); + let single_term = schema_builder.add_text_field("single_term", FAST); let json_field = schema_builder.add_json_field("json", FAST); let text_field_all_unique_terms = schema_builder.add_text_field("text_all_unique_terms", STRING | FAST); @@ -673,6 +733,8 @@ fn get_test_index_bench(cardinality: Cardinality) -> tantivy::Result { index_writer.add_document(doc!( json_field => json!({"mixed_type": 10.0}), json_field => json!({"mixed_type": 10.0}), + single_term => "single_term", + single_term => "single_term", text_field => "cool", text_field => "cool", text_field_all_unique_terms => "cool", @@ -707,6 +769,7 @@ fn get_test_index_bench(cardinality: Cardinality) -> tantivy::Result { json!({"mixed_type": many_terms_data.choose(&mut rng).unwrap().to_string()}) }; index_writer.add_document(doc!( + single_term => "single_term", text_field => "cool", json_field => json, text_field_all_unique_terms => format!("unique_term_{}", rng.random::()),