mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-11-29 16:24:26 +01:00
Implement all and last matching strategy
This commit is contained in:
parent
e2af8dccb8
commit
c9bb111ef3
@ -366,6 +366,9 @@ pub struct SearchAggregator {
|
|||||||
// The maximum number of terms in a q request
|
// The maximum number of terms in a q request
|
||||||
max_terms_number: usize,
|
max_terms_number: usize,
|
||||||
|
|
||||||
|
// everytime a search is done, we increment the counter linked to the used settings
|
||||||
|
matching_strategy: HashMap<String, usize>,
|
||||||
|
|
||||||
// pagination
|
// pagination
|
||||||
max_limit: usize,
|
max_limit: usize,
|
||||||
max_offset: usize,
|
max_offset: usize,
|
||||||
@ -423,6 +426,9 @@ impl SearchAggregator {
|
|||||||
ret.max_terms_number = q.split_whitespace().count();
|
ret.max_terms_number = q.split_whitespace().count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret.matching_strategy
|
||||||
|
.insert(format!("{:?}", query.matching_strategy), 1);
|
||||||
|
|
||||||
ret.max_limit = query.limit;
|
ret.max_limit = query.limit;
|
||||||
ret.max_offset = query.offset.unwrap_or_default();
|
ret.max_offset = query.offset.unwrap_or_default();
|
||||||
|
|
||||||
@ -476,6 +482,11 @@ impl SearchAggregator {
|
|||||||
}
|
}
|
||||||
// q
|
// q
|
||||||
self.max_terms_number = self.max_terms_number.max(other.max_terms_number);
|
self.max_terms_number = self.max_terms_number.max(other.max_terms_number);
|
||||||
|
|
||||||
|
for (key, value) in other.matching_strategy.into_iter() {
|
||||||
|
let matching_strategy = self.matching_strategy.entry(key).or_insert(0);
|
||||||
|
*matching_strategy = matching_strategy.saturating_add(value);
|
||||||
|
}
|
||||||
// pagination
|
// pagination
|
||||||
self.max_limit = self.max_limit.max(other.max_limit);
|
self.max_limit = self.max_limit.max(other.max_limit);
|
||||||
self.max_offset = self.max_offset.max(other.max_offset);
|
self.max_offset = self.max_offset.max(other.max_offset);
|
||||||
@ -517,6 +528,7 @@ impl SearchAggregator {
|
|||||||
},
|
},
|
||||||
"q": {
|
"q": {
|
||||||
"max_terms_number": self.max_terms_number,
|
"max_terms_number": self.max_terms_number,
|
||||||
|
"most_used_matching_strategy": self.matching_strategy.iter().max_by_key(|(_, v)| *v).map(|(k, _)| json!(k)).unwrap_or_else(|| json!(null)),
|
||||||
},
|
},
|
||||||
"pagination": {
|
"pagination": {
|
||||||
"max_limit": self.max_limit,
|
"max_limit": self.max_limit,
|
||||||
|
@ -2,8 +2,8 @@ use actix_web::{web, HttpRequest, HttpResponse};
|
|||||||
use log::debug;
|
use log::debug;
|
||||||
use meilisearch_auth::IndexSearchRules;
|
use meilisearch_auth::IndexSearchRules;
|
||||||
use meilisearch_lib::index::{
|
use meilisearch_lib::index::{
|
||||||
SearchQuery, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG,
|
MatchingStrategy, SearchQuery, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
||||||
DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
||||||
};
|
};
|
||||||
use meilisearch_lib::MeiliSearch;
|
use meilisearch_lib::MeiliSearch;
|
||||||
use meilisearch_types::error::ResponseError;
|
use meilisearch_types::error::ResponseError;
|
||||||
@ -45,6 +45,8 @@ pub struct SearchQueryGet {
|
|||||||
highlight_post_tag: String,
|
highlight_post_tag: String,
|
||||||
#[serde(default = "DEFAULT_CROP_MARKER")]
|
#[serde(default = "DEFAULT_CROP_MARKER")]
|
||||||
crop_marker: String,
|
crop_marker: String,
|
||||||
|
#[serde(default)]
|
||||||
|
matching_strategy: MatchingStrategy,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<SearchQueryGet> for SearchQuery {
|
impl From<SearchQueryGet> for SearchQuery {
|
||||||
@ -76,6 +78,7 @@ impl From<SearchQueryGet> for SearchQuery {
|
|||||||
highlight_pre_tag: other.highlight_pre_tag,
|
highlight_pre_tag: other.highlight_pre_tag,
|
||||||
highlight_post_tag: other.highlight_post_tag,
|
highlight_post_tag: other.highlight_post_tag,
|
||||||
crop_marker: other.crop_marker,
|
crop_marker: other.crop_marker,
|
||||||
|
matching_strategy: other.matching_strategy,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
pub use search::{
|
pub use search::{
|
||||||
SearchQuery, SearchResult, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
MatchingStrategy, SearchQuery, SearchResult, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
||||||
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
||||||
};
|
};
|
||||||
pub use updates::{apply_settings_to_builder, Checked, Facets, Settings, Unchecked};
|
pub use updates::{apply_settings_to_builder, Checked, Facets, Settings, Unchecked};
|
||||||
|
@ -7,7 +7,7 @@ use either::Either;
|
|||||||
use milli::tokenizer::TokenizerBuilder;
|
use milli::tokenizer::TokenizerBuilder;
|
||||||
use milli::{
|
use milli::{
|
||||||
AscDesc, FieldId, FieldsIdsMap, Filter, FormatOptions, MatchBounds, MatcherBuilder, SortError,
|
AscDesc, FieldId, FieldsIdsMap, Filter, FormatOptions, MatchBounds, MatcherBuilder, SortError,
|
||||||
DEFAULT_VALUES_PER_FACET,
|
TermsMatchingStrategy, DEFAULT_VALUES_PER_FACET,
|
||||||
};
|
};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -55,6 +55,32 @@ pub struct SearchQuery {
|
|||||||
pub highlight_post_tag: String,
|
pub highlight_post_tag: String,
|
||||||
#[serde(default = "DEFAULT_CROP_MARKER")]
|
#[serde(default = "DEFAULT_CROP_MARKER")]
|
||||||
pub crop_marker: String,
|
pub crop_marker: String,
|
||||||
|
#[serde(default)]
|
||||||
|
pub matching_strategy: MatchingStrategy,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub enum MatchingStrategy {
|
||||||
|
// remove last word first
|
||||||
|
Last,
|
||||||
|
// all words are mandatory
|
||||||
|
All,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for MatchingStrategy {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Last
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<MatchingStrategy> for TermsMatchingStrategy {
|
||||||
|
fn from(other: MatchingStrategy) -> Self {
|
||||||
|
match other {
|
||||||
|
MatchingStrategy::Last => Self::Last,
|
||||||
|
MatchingStrategy::All => Self::All,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, PartialEq)]
|
#[derive(Debug, Clone, Serialize, PartialEq)]
|
||||||
@ -91,6 +117,8 @@ impl Index {
|
|||||||
search.query(query);
|
search.query(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
search.terms_matching_strategy(query.matching_strategy.into());
|
||||||
|
|
||||||
let max_total_hits = self
|
let max_total_hits = self
|
||||||
.pagination_max_total_hits(&rtxn)?
|
.pagination_max_total_hits(&rtxn)?
|
||||||
.unwrap_or(DEFAULT_PAGINATION_MAX_TOTAL_HITS);
|
.unwrap_or(DEFAULT_PAGINATION_MAX_TOTAL_HITS);
|
||||||
|
@ -704,6 +704,7 @@ mod test {
|
|||||||
highlight_pre_tag: DEFAULT_HIGHLIGHT_PRE_TAG(),
|
highlight_pre_tag: DEFAULT_HIGHLIGHT_PRE_TAG(),
|
||||||
highlight_post_tag: DEFAULT_HIGHLIGHT_POST_TAG(),
|
highlight_post_tag: DEFAULT_HIGHLIGHT_POST_TAG(),
|
||||||
crop_marker: DEFAULT_CROP_MARKER(),
|
crop_marker: DEFAULT_CROP_MARKER(),
|
||||||
|
matching_strategy: Default::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let result = SearchResult {
|
let result = SearchResult {
|
||||||
|
Loading…
Reference in New Issue
Block a user