diff --git a/Cargo.lock b/Cargo.lock index 91f11d5ae..aa7624bfe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1141,6 +1141,7 @@ dependencies = [ "serde_qs", "sha2", "siphasher", + "slice-group-by", "structopt", "sysinfo", "tempdir", diff --git a/meilisearch-http/Cargo.toml b/meilisearch-http/Cargo.toml index 2b731f5e6..265265d57 100644 --- a/meilisearch-http/Cargo.toml +++ b/meilisearch-http/Cargo.toml @@ -42,6 +42,7 @@ tide = "0.6.0" ureq = { version = "0.12.0", features = ["tls"], default-features = false } walkdir = "2.3.1" whoami = "0.8.1" +slice-group-by = "0.2.6" [dev-dependencies] http-service = "0.4.0" diff --git a/meilisearch-http/src/helpers/meilisearch.rs b/meilisearch-http/src/helpers/meilisearch.rs index 9dba1696d..6218c5f2c 100644 --- a/meilisearch-http/src/helpers/meilisearch.rs +++ b/meilisearch-http/src/helpers/meilisearch.rs @@ -17,6 +17,7 @@ use meilisearch_tokenizer::is_cjk; use serde::{Deserialize, Serialize}; use serde_json::Value; use siphasher::sip::SipHasher; +use slice_group_by::GroupBy; #[derive(Debug)] pub enum Error { @@ -526,7 +527,12 @@ fn calculate_highlights( let value: Vec<_> = value.chars().collect(); let mut highlighted_value = String::new(); let mut index = 0; - for m in matches { + + let longest_matches = matches + .linear_group_by_key(|m| m.start) + .map(|group| group.last().unwrap()); + + for m in longest_matches { if m.start >= index { let before = value.get(index..m.start); let highlighted = value.get(m.start..(m.start + m.length));