Change consecutive phrase search grouping logic

Co-authored-by: ManyTheFish <many@meilisearch.com>
This commit is contained in:
Samyak S Sarnayak 2022-10-26 23:10:48 +05:30
parent 752d031010
commit d35afa0cf5
No known key found for this signature in database
GPG Key ID: 365873F2F0C6153B

View File

@ -4,6 +4,7 @@ use std::mem::take;
use log::debug; use log::debug;
use roaring::RoaringBitmap; use roaring::RoaringBitmap;
use slice_group_by::GroupBy;
use super::{ use super::{
query_docids, query_pair_proximity_docids, resolve_phrase, resolve_query_tree, Context, query_docids, query_pair_proximity_docids, resolve_phrase, resolve_query_tree, Context,
@ -478,29 +479,30 @@ fn resolve_plane_sweep_candidates(
} }
Phrase(words) => { Phrase(words) => {
let mut groups_positions = Vec::with_capacity(words.len()); let mut groups_positions = Vec::with_capacity(words.len());
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 { // group stop_words together.
consecutive = false; for words in words.linear_group_by_key(Option::is_none) {
} // skip if it's a group of stop words.
was_last_word_a_stop_word = false; if matches!(words.first(), None | Some(None)) {
} else { continue;
if !was_last_word_a_stop_word {
consecutive = false;
}
was_last_word_a_stop_word = true;
} }
// make a consecutive plane-sweep on the subgroup of words.
let mut subgroup = Vec::with_capacity(words.len());
for word in words.into_iter().map(|w| w.as_deref().unwrap()) {
match words_positions.get(word) {
Some(positions) => {
subgroup.push(positions.iter().map(|p| (p, 0, p)).collect())
}
None => return Ok(vec![]),
}
}
groups_positions.push(plane_sweep(subgroup, true)?);
}
match groups_positions.len() {
0 => vec![],
1 => groups_positions.pop().unwrap(),
_ => plane_sweep(groups_positions, false)?,
} }
plane_sweep(groups_positions, consecutive)?
} }
Or(_, ops) => { Or(_, ops) => {
let mut result = Vec::new(); let mut result = Vec::new();