Skip to content

Commit 6de4acf

Browse files
authored
Merge pull request #676 from meilisearch/faceting2
Allow users to customize facet value sort behaviour
2 parents 6eb41e8 + 763c1c5 commit 6de4acf

File tree

2 files changed

+147
-14
lines changed

2 files changed

+147
-14
lines changed

.code-samples.meilisearch.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Every example written here will be automatically fetched by
33
# the documentation on build
44
# You can read more on https://github.com/meilisearch/documentation/tree/main/learn
5+
# See the original at https://github.com/meilisearch/documentation/blob/main/.code-samples.meilisearch.yaml
56
---
67
synonyms_guide_1: |-
78
let mut synonyms = std::collections::HashMap::new();
@@ -581,8 +582,12 @@ get_faceting_settings_1: |-
581582
.await
582583
.unwrap();
583584
update_faceting_settings_1: |-
585+
let mut facet_sort_setting = BTreeMap::new();
586+
facet_sort_setting.insert(String::from("*"), FacetSortValue::Alpha);
587+
facet_sort_setting.insert(String::from("genres"), FacetSortValue::Count);
584588
let mut faceting = FacetingSettings {
585589
max_values_per_facet: 2,
590+
sort_facet_values_by: Some(facet_sort_setting),
586591
};
587592
588593
let task: TaskInfo = client
@@ -1265,8 +1270,11 @@ getting_started_sorting: |-
12651270
.await
12661271
.unwrap();
12671272
getting_started_faceting: |-
1273+
let mut facet_sort_setting = BTreeMap::new();
1274+
facet_sort_setting.insert("*".to_string(), FacetSortValue::Count);
12681275
let mut faceting = FacetingSettings {
12691276
max_values_per_facet: 2,
1277+
sort_facet_values_by: Some(facet_sort_setting),
12701278
};
12711279
12721280
let task: TaskInfo = client
@@ -1671,6 +1679,18 @@ facet_search_1: |-
16711679
.execute()
16721680
.await
16731681
.unwrap();
1682+
facet_search_2: |-
1683+
let mut facet_sort_setting = BTreeMap::new();
1684+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
1685+
let faceting = FacetingSettings {
1686+
max_values_per_facet: 100,
1687+
sort_facet_values_by: Some(facet_sort_setting),
1688+
};
1689+
1690+
let res = client.index("books")
1691+
.set_faceting(&faceting)
1692+
.await
1693+
.unwrap();
16741694
facet_search_3: |-
16751695
let res = client.index("books")
16761696
.facet_search("genres")

src/settings.rs

Lines changed: 127 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
task_info::TaskInfo,
66
};
77
use serde::{Deserialize, Serialize};
8-
use std::collections::HashMap;
8+
use std::collections::{BTreeMap, HashMap};
99

1010
#[derive(Serialize, Deserialize, Default, Debug, Clone, PartialEq, Eq, Copy)]
1111
#[serde(rename_all = "camelCase")]
@@ -30,10 +30,21 @@ pub struct TypoToleranceSettings {
3030
pub min_word_size_for_typos: Option<MinWordSizeForTypos>,
3131
}
3232

33-
#[derive(Serialize, Deserialize, Default, Debug, Clone, Eq, PartialEq, Copy)]
33+
#[derive(Debug, Deserialize, Clone, Eq, PartialEq, Serialize)]
34+
#[serde(rename_all = "camelCase")]
35+
pub enum FacetSortValue {
36+
Alpha,
37+
Count,
38+
}
39+
40+
#[derive(Serialize, Deserialize, Default, Debug, Clone, Eq, PartialEq)]
3441
#[serde(rename_all = "camelCase")]
3542
pub struct FacetingSettings {
43+
/// Maximum number of facet values returned for each facet. Values are sorted in ascending lexicographical order
3644
pub max_values_per_facet: usize,
45+
/// Customize facet order to sort by descending value count (count) or ascending alphanumeric order (alpha)
46+
#[serde(skip_serializing_if = "Option::is_none")]
47+
pub sort_facet_values_by: Option<BTreeMap<String, FacetSortValue>>,
3748
}
3849

3950
#[derive(Serialize, Deserialize, Default, Debug, Clone, Eq, PartialEq)]
@@ -278,9 +289,32 @@ impl Settings {
278289
}
279290

280291
#[must_use]
281-
pub fn with_faceting(self, faceting: &FacetingSettings) -> Settings {
292+
pub fn with_faceting(self, faceting: FacetingSettings) -> Settings {
282293
Settings {
283-
faceting: Some(*faceting),
294+
faceting: Some(faceting),
295+
..self
296+
}
297+
}
298+
299+
#[must_use]
300+
pub fn with_max_values_per_facet(mut self, max_values_per_facet: usize) -> Settings {
301+
let mut faceting = self.faceting.take().unwrap_or_default();
302+
faceting.max_values_per_facet = max_values_per_facet;
303+
Settings {
304+
faceting: Some(faceting),
305+
..self
306+
}
307+
}
308+
309+
#[must_use]
310+
pub fn with_sort_facet_values_by(
311+
mut self,
312+
sort_facet_values_by: BTreeMap<String, FacetSortValue>,
313+
) -> Settings {
314+
let mut faceting = self.faceting.take().unwrap_or_default();
315+
faceting.sort_facet_values_by = Some(sort_facet_values_by);
316+
Settings {
317+
faceting: Some(faceting),
284318
..self
285319
}
286320
}
@@ -1397,6 +1431,7 @@ impl<Http: HttpClient> Index<Http> {
13971431
///
13981432
/// let mut faceting = FacetingSettings {
13991433
/// max_values_per_facet: 12,
1434+
/// sort_facet_values_by: None,
14001435
/// };
14011436
///
14021437
/// let task = index.set_faceting(&faceting).await.unwrap();
@@ -2314,54 +2349,132 @@ mod tests {
23142349

23152350
#[meilisearch_test]
23162351
async fn test_set_faceting_settings(client: Client, index: Index) {
2317-
let faceting = FacetingSettings {
2352+
let settings = Settings::new().with_max_values_per_facet(5);
2353+
2354+
let task_info = index.set_settings(&settings).await.unwrap();
2355+
client.wait_for_task(task_info, None, None).await.unwrap();
2356+
2357+
let res = index.get_faceting().await.unwrap();
2358+
2359+
let mut expected_facet_sort_setting = BTreeMap::new();
2360+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2361+
let expected_faceting = FacetingSettings {
23182362
max_values_per_facet: 5,
2363+
sort_facet_values_by: Some(expected_facet_sort_setting),
23192364
};
2320-
let settings = Settings::new().with_faceting(&faceting);
2365+
2366+
assert_eq!(expected_faceting, res);
2367+
}
2368+
2369+
#[meilisearch_test]
2370+
async fn test_set_faceting_settings_with_sort_values(client: Client, index: Index) {
2371+
let mut req_facet_sort_setting = BTreeMap::new();
2372+
req_facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
2373+
let req_faceting = FacetingSettings {
2374+
max_values_per_facet: 5,
2375+
sort_facet_values_by: Some(req_facet_sort_setting),
2376+
};
2377+
let settings = Settings::new().with_faceting(req_faceting.clone());
23212378

23222379
let task_info = index.set_settings(&settings).await.unwrap();
23232380
client.wait_for_task(task_info, None, None).await.unwrap();
23242381

23252382
let res = index.get_faceting().await.unwrap();
23262383

2327-
assert_eq!(faceting, res);
2384+
let mut expected_facet_sort_setting = BTreeMap::new();
2385+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2386+
expected_facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
2387+
let expected_faceting = FacetingSettings {
2388+
max_values_per_facet: req_faceting.max_values_per_facet,
2389+
sort_facet_values_by: Some(expected_facet_sort_setting),
2390+
};
2391+
2392+
assert_eq!(expected_faceting, res);
23282393
}
23292394

23302395
#[meilisearch_test]
23312396
async fn test_get_faceting(index: Index) {
2332-
let faceting = FacetingSettings {
2397+
let req_faceting = FacetingSettings {
23332398
max_values_per_facet: 100,
2399+
sort_facet_values_by: None,
23342400
};
23352401

23362402
let res = index.get_faceting().await.unwrap();
23372403

2338-
assert_eq!(faceting, res);
2404+
let mut expected_facet_sort_setting = BTreeMap::new();
2405+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2406+
let expected_faceting = FacetingSettings {
2407+
max_values_per_facet: req_faceting.max_values_per_facet,
2408+
sort_facet_values_by: Some(expected_facet_sort_setting),
2409+
};
2410+
2411+
assert_eq!(expected_faceting, res);
23392412
}
23402413

23412414
#[meilisearch_test]
23422415
async fn test_set_faceting(client: Client, index: Index) {
2343-
let faceting = FacetingSettings {
2416+
let req_faceting = FacetingSettings {
2417+
max_values_per_facet: 5,
2418+
sort_facet_values_by: None,
2419+
};
2420+
let task_info = index.set_faceting(&req_faceting).await.unwrap();
2421+
client.wait_for_task(task_info, None, None).await.unwrap();
2422+
2423+
let res = index.get_faceting().await.unwrap();
2424+
2425+
let mut expected_facet_sort_setting = BTreeMap::new();
2426+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2427+
let expected_faceting = FacetingSettings {
2428+
max_values_per_facet: req_faceting.max_values_per_facet,
2429+
sort_facet_values_by: Some(expected_facet_sort_setting),
2430+
};
2431+
2432+
assert_eq!(expected_faceting, res);
2433+
}
2434+
2435+
#[meilisearch_test]
2436+
async fn test_set_faceting_with_sort_values(client: Client, index: Index) {
2437+
let mut req_facet_sort_setting = BTreeMap::new();
2438+
req_facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
2439+
let req_faceting = FacetingSettings {
23442440
max_values_per_facet: 5,
2441+
sort_facet_values_by: Some(req_facet_sort_setting),
23452442
};
2346-
let task_info = index.set_faceting(&faceting).await.unwrap();
2443+
let task_info = index.set_faceting(&req_faceting).await.unwrap();
23472444
client.wait_for_task(task_info, None, None).await.unwrap();
23482445

23492446
let res = index.get_faceting().await.unwrap();
23502447

2351-
assert_eq!(faceting, res);
2448+
let mut expected_facet_sort_setting = BTreeMap::new();
2449+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2450+
expected_facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
2451+
let expected_faceting = FacetingSettings {
2452+
max_values_per_facet: req_faceting.max_values_per_facet,
2453+
sort_facet_values_by: Some(expected_facet_sort_setting),
2454+
};
2455+
2456+
assert_eq!(expected_faceting, res);
23522457
}
23532458

23542459
#[meilisearch_test]
23552460
async fn test_reset_faceting(client: Client, index: Index) {
23562461
let task_info = index.reset_faceting().await.unwrap();
23572462
client.wait_for_task(task_info, None, None).await.unwrap();
2358-
let faceting = FacetingSettings {
2463+
let req_faceting = FacetingSettings {
23592464
max_values_per_facet: 100,
2465+
sort_facet_values_by: None,
23602466
};
23612467

23622468
let res = index.get_faceting().await.unwrap();
23632469

2364-
assert_eq!(faceting, res);
2470+
let mut expected_facet_sort_setting = BTreeMap::new();
2471+
expected_facet_sort_setting.insert("*".to_string(), FacetSortValue::Alpha);
2472+
let expected_faceting = FacetingSettings {
2473+
max_values_per_facet: req_faceting.max_values_per_facet,
2474+
sort_facet_values_by: Some(expected_facet_sort_setting),
2475+
};
2476+
2477+
assert_eq!(expected_faceting, res);
23652478
}
23662479

23672480
#[meilisearch_test]

0 commit comments

Comments
 (0)