diff --git a/milli/src/search/criteria/proximity.rs b/milli/src/search/criteria/proximity.rs index 5aa3cc8b3..5f414d84c 100644 --- a/milli/src/search/criteria/proximity.rs +++ b/milli/src/search/criteria/proximity.rs @@ -478,14 +478,29 @@ fn resolve_plane_sweep_candidates( } Phrase(words) => { let mut groups_positions = Vec::with_capacity(words.len()); - for word in words.iter().filter_map(|w| w.as_ref()) { - let positions = match words_positions.get(word) { - Some(positions) => positions.iter().map(|p| (p, 0, p)).collect(), - None => return Ok(vec![]), - }; - groups_positions.push(positions); + let mut consecutive = true; + let mut was_last_word_a_stop_word = false; + for word in words.iter() { + if let Some(word) = word { + let positions = match words_positions.get(word) { + Some(positions) => positions.iter().map(|p| (p, 0, p)).collect(), + None => return Ok(vec![]), + }; + groups_positions.push(positions); + + if was_last_word_a_stop_word { + consecutive = false; + } + was_last_word_a_stop_word = false; + } else { + if !was_last_word_a_stop_word { + consecutive = false; + } + + was_last_word_a_stop_word = true; + } } - plane_sweep(groups_positions, true)? + plane_sweep(groups_positions, consecutive)? } Or(_, ops) => { let mut result = Vec::new();