mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-10-31 07:56:28 +00:00 
			
		
		
		
	Merge #2406
2406: chore(search): rename in the search endpoint r=irevoire a=irevoire Fix #2376 Co-authored-by: Irevoire <tamo@meilisearch.com>
This commit is contained in:
		| @@ -362,7 +362,7 @@ pub struct SearchAggregator { | ||||
|     highlight_pre_tag: bool, | ||||
|     highlight_post_tag: bool, | ||||
|     crop_marker: bool, | ||||
|     matches: bool, | ||||
|     show_matches_position: bool, | ||||
|     crop_length: bool, | ||||
| } | ||||
|  | ||||
| @@ -418,7 +418,7 @@ impl SearchAggregator { | ||||
|         ret.highlight_post_tag = query.highlight_post_tag != DEFAULT_HIGHLIGHT_POST_TAG; | ||||
|         ret.crop_marker = query.crop_marker != DEFAULT_CROP_MARKER; | ||||
|         ret.crop_length = query.crop_length != DEFAULT_CROP_LENGTH; | ||||
|         ret.matches = query.matches; | ||||
|         ret.show_matches_position = query.show_matches_position; | ||||
|  | ||||
|         ret | ||||
|     } | ||||
| @@ -471,7 +471,7 @@ impl SearchAggregator { | ||||
|         self.highlight_pre_tag |= other.highlight_pre_tag; | ||||
|         self.highlight_post_tag |= other.highlight_post_tag; | ||||
|         self.crop_marker |= other.crop_marker; | ||||
|         self.matches |= other.matches; | ||||
|         self.show_matches_position |= other.show_matches_position; | ||||
|         self.crop_length |= other.crop_length; | ||||
|     } | ||||
|  | ||||
| @@ -514,7 +514,7 @@ impl SearchAggregator { | ||||
|                     "highlight_pre_tag": self.highlight_pre_tag, | ||||
|                     "highlight_post_tag": self.highlight_post_tag, | ||||
|                     "crop_marker": self.crop_marker, | ||||
|                     "matches": self.matches, | ||||
|                     "show_matches_position": self.show_matches_position, | ||||
|                     "crop_length": self.crop_length, | ||||
|                 }, | ||||
|             }); | ||||
|   | ||||
| @@ -36,8 +36,8 @@ pub struct SearchQueryGet { | ||||
|     filter: Option<String>, | ||||
|     sort: Option<String>, | ||||
|     #[serde(default = "Default::default")] | ||||
|     matches: bool, | ||||
|     facets_distribution: Option<String>, | ||||
|     show_matches_position: bool, | ||||
|     facets: Option<String>, | ||||
|     #[serde(default = "default_highlight_pre_tag")] | ||||
|     highlight_pre_tag: String, | ||||
|     #[serde(default = "default_highlight_post_tag")] | ||||
| @@ -60,8 +60,8 @@ impl From<SearchQueryGet> for SearchQuery { | ||||
|             .attributes_to_highlight | ||||
|             .map(|attrs| attrs.split(',').map(String::from).collect()); | ||||
|  | ||||
|         let facets_distribution = other | ||||
|             .facets_distribution | ||||
|         let facets = other | ||||
|             .facets | ||||
|             .map(|attrs| attrs.split(',').map(String::from).collect()); | ||||
|  | ||||
|         let filter = match other.filter { | ||||
| @@ -84,8 +84,8 @@ impl From<SearchQueryGet> for SearchQuery { | ||||
|             attributes_to_highlight, | ||||
|             filter, | ||||
|             sort, | ||||
|             matches: other.matches, | ||||
|             facets_distribution, | ||||
|             show_matches_position: other.show_matches_position, | ||||
|             facets, | ||||
|             highlight_pre_tag: other.highlight_pre_tag, | ||||
|             highlight_post_tag: other.highlight_post_tag, | ||||
|             crop_marker: other.crop_marker, | ||||
| @@ -169,10 +169,6 @@ pub async fn search_with_url_query( | ||||
|  | ||||
|     let search_result = search_result?; | ||||
|  | ||||
|     // Tests that the nb_hits is always set to false | ||||
|     #[cfg(test)] | ||||
|     assert!(!search_result.exhaustive_nb_hits); | ||||
|  | ||||
|     debug!("returns: {:?}", search_result); | ||||
|     Ok(HttpResponse::Ok().json(search_result)) | ||||
| } | ||||
| @@ -207,10 +203,6 @@ pub async fn search_with_post( | ||||
|  | ||||
|     let search_result = search_result?; | ||||
|  | ||||
|     // Tests that the nb_hits is always set to false | ||||
|     #[cfg(test)] | ||||
|     assert!(!search_result.exhaustive_nb_hits); | ||||
|  | ||||
|     debug!("returns: {:?}", search_result); | ||||
|     Ok(HttpResponse::Ok().json(search_result)) | ||||
| } | ||||
|   | ||||
| @@ -16,7 +16,7 @@ async fn formatted_contain_wildcard() { | ||||
|     index.wait_task(1).await; | ||||
|  | ||||
|     let (response, code) = index | ||||
|         .search_post(json!({ "q": "pesti", "attributesToRetrieve": ["father", "mother"], "attributesToHighlight": ["father", "mother", "*"], "attributesToCrop": ["doggos"], "matches": true })) | ||||
|         .search_post(json!({ "q": "pesti", "attributesToRetrieve": ["father", "mother"], "attributesToHighlight": ["father", "mother", "*"], "attributesToCrop": ["doggos"], "showMatchesPosition": true })) | ||||
|         .await; | ||||
|     assert_eq!(code, 200, "{}", response); | ||||
|     assert_eq!( | ||||
| @@ -26,7 +26,7 @@ async fn formatted_contain_wildcard() { | ||||
|                 "id": "852", | ||||
|                 "cattos": "<em>pesti</em>", | ||||
|             }, | ||||
|             "_matchesInfo": {"cattos": [{"start": 0, "length": 5}]}, | ||||
|             "_matchesPosition": {"cattos": [{"start": 0, "length": 5}]}, | ||||
|         }) | ||||
|     ); | ||||
|  | ||||
| @@ -44,7 +44,7 @@ async fn formatted_contain_wildcard() { | ||||
|  | ||||
|     let (response, code) = index | ||||
|         .search_post( | ||||
|             json!({ "q": "pesti", "attributesToRetrieve": ["*"], "attributesToHighlight": ["id"], "matches": true }), | ||||
|             json!({ "q": "pesti", "attributesToRetrieve": ["*"], "attributesToHighlight": ["id"], "showMatchesPosition": true }), | ||||
|         ) | ||||
|         .await; | ||||
|     assert_eq!(code, 200, "{}", response); | ||||
| @@ -57,7 +57,7 @@ async fn formatted_contain_wildcard() { | ||||
|                 "id": "852", | ||||
|                 "cattos": "pesti", | ||||
|             }, | ||||
|             "_matchesInfo": {"cattos": [{"start": 0, "length": 5}]}, | ||||
|             "_matchesPosition": {"cattos": [{"start": 0, "length": 5}]}, | ||||
|         }) | ||||
|     ); | ||||
|  | ||||
| @@ -145,7 +145,7 @@ async fn format_nested() { | ||||
|  | ||||
|     let (response, code) = index | ||||
|         .search_post( | ||||
|             json!({ "q": "bobby", "attributesToRetrieve": ["doggos.name"], "matches": true }), | ||||
|             json!({ "q": "bobby", "attributesToRetrieve": ["doggos.name"], "showMatchesPosition": true }), | ||||
|         ) | ||||
|         .await; | ||||
|     assert_eq!(code, 200, "{}", response); | ||||
| @@ -160,7 +160,7 @@ async fn format_nested() { | ||||
|                     "name": "buddy", | ||||
|                 }, | ||||
|             ], | ||||
|             "_matchesInfo": {"doggos.name": [{"start": 0, "length": 5}]}, | ||||
|             "_matchesPosition": {"doggos.name": [{"start": 0, "length": 5}]}, | ||||
|         }) | ||||
|     ); | ||||
|  | ||||
|   | ||||
| @@ -420,11 +420,11 @@ async fn search_facet_distribution() { | ||||
|     index | ||||
|         .search( | ||||
|             json!({ | ||||
|                 "facetsDistribution": ["title"] | ||||
|                 "facets": ["title"] | ||||
|             }), | ||||
|             |response, code| { | ||||
|                 assert_eq!(code, 200, "{}", response); | ||||
|                 let dist = response["facetsDistribution"].as_object().unwrap(); | ||||
|                 let dist = response["facetDistribution"].as_object().unwrap(); | ||||
|                 assert_eq!(dist.len(), 1); | ||||
|                 assert!(dist.get("title").is_some()); | ||||
|             }, | ||||
| @@ -445,12 +445,12 @@ async fn search_facet_distribution() { | ||||
|     index | ||||
|         .search( | ||||
|             json!({ | ||||
|                 // "facetsDistribution": ["father", "doggos.name"] | ||||
|                 "facetsDistribution": ["father"] | ||||
|                 // "facets": ["father", "doggos.name"] | ||||
|                 "facets": ["father"] | ||||
|             }), | ||||
|             |response, code| { | ||||
|                 assert_eq!(code, 200, "{}", response); | ||||
|                 let dist = response["facetsDistribution"].as_object().unwrap(); | ||||
|                 let dist = response["facetDistribution"].as_object().unwrap(); | ||||
|                 assert_eq!(dist.len(), 1); | ||||
|                 assert_eq!( | ||||
|                     dist["father"], | ||||
| @@ -474,11 +474,11 @@ async fn search_facet_distribution() { | ||||
|     index | ||||
|         .search( | ||||
|             json!({ | ||||
|                 "facetsDistribution": ["doggos.name"] | ||||
|                 "facets": ["doggos.name"] | ||||
|             }), | ||||
|             |response, code| { | ||||
|                 assert_eq!(code, 200, "{}", response); | ||||
|                 let dist = response["facetsDistribution"].as_object().unwrap(); | ||||
|                 let dist = response["facetDistribution"].as_object().unwrap(); | ||||
|                 assert_eq!(dist.len(), 1); | ||||
|                 assert_eq!( | ||||
|                     dist["doggos.name"], | ||||
| @@ -491,11 +491,11 @@ async fn search_facet_distribution() { | ||||
|     index | ||||
|         .search( | ||||
|             json!({ | ||||
|                 "facetsDistribution": ["doggos"] | ||||
|                 "facets": ["doggos"] | ||||
|             }), | ||||
|             |response, code| { | ||||
|                 assert_eq!(code, 200, "{}", response); | ||||
|                 let dist = response["facetsDistribution"].as_object().unwrap(); | ||||
|                 let dist = response["facetDistribution"].as_object().unwrap(); | ||||
|                 dbg!(&dist); | ||||
|                 assert_eq!(dist.len(), 3); | ||||
|                 assert_eq!( | ||||
|   | ||||
| @@ -18,7 +18,7 @@ use super::error::{IndexError, Result}; | ||||
| use super::index::Index; | ||||
|  | ||||
| pub type Document = serde_json::Map<String, Value>; | ||||
| type MatchesInfo = BTreeMap<String, Vec<MatchBounds>>; | ||||
| type MatchesPosition = BTreeMap<String, Vec<MatchBounds>>; | ||||
|  | ||||
| pub const DEFAULT_SEARCH_LIMIT: usize = 20; | ||||
| const fn default_search_limit() -> usize { | ||||
| @@ -63,10 +63,10 @@ pub struct SearchQuery { | ||||
|     pub attributes_to_highlight: Option<HashSet<String>>, | ||||
|     // Default to false | ||||
|     #[serde(default = "Default::default")] | ||||
|     pub matches: bool, | ||||
|     pub show_matches_position: bool, | ||||
|     pub filter: Option<Value>, | ||||
|     pub sort: Option<Vec<String>>, | ||||
|     pub facets_distribution: Option<Vec<String>>, | ||||
|     pub facets: Option<Vec<String>>, | ||||
|     #[serde(default = "default_highlight_pre_tag")] | ||||
|     pub highlight_pre_tag: String, | ||||
|     #[serde(default = "default_highlight_post_tag")] | ||||
| @@ -81,24 +81,21 @@ pub struct SearchHit { | ||||
|     pub document: Document, | ||||
|     #[serde(rename = "_formatted", skip_serializing_if = "Document::is_empty")] | ||||
|     pub formatted: Document, | ||||
|     #[serde(rename = "_matchesInfo", skip_serializing_if = "Option::is_none")] | ||||
|     pub matches_info: Option<MatchesInfo>, | ||||
|     #[serde(rename = "_matchesPosition", skip_serializing_if = "Option::is_none")] | ||||
|     pub matches_position: Option<MatchesPosition>, | ||||
| } | ||||
|  | ||||
| #[derive(Serialize, Debug, Clone, PartialEq)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct SearchResult { | ||||
|     pub hits: Vec<SearchHit>, | ||||
|     pub nb_hits: u64, | ||||
|     pub exhaustive_nb_hits: bool, | ||||
|     pub estimated_total_hits: u64, | ||||
|     pub query: String, | ||||
|     pub limit: usize, | ||||
|     pub offset: usize, | ||||
|     pub processing_time_ms: u128, | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub facets_distribution: Option<BTreeMap<String, BTreeMap<String, u64>>>, | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub exhaustive_facets_count: Option<bool>, | ||||
|     pub facet_distribution: Option<BTreeMap<String, BTreeMap<String, u64>>>, | ||||
| } | ||||
|  | ||||
| impl Index { | ||||
| @@ -222,13 +219,13 @@ impl Index { | ||||
|             let mut document = | ||||
|                 permissive_json_pointer::select_values(&displayed_document, attributes_to_retrieve); | ||||
|  | ||||
|             let (matches_info, formatted) = format_fields( | ||||
|             let (matches_position, formatted) = format_fields( | ||||
|                 &displayed_document, | ||||
|                 &fields_ids_map, | ||||
|                 &formatter_builder, | ||||
|                 &analyzer, | ||||
|                 &formatted_options, | ||||
|                 query.matches, | ||||
|                 query.show_matches_position, | ||||
|                 &displayed_ids, | ||||
|             )?; | ||||
|  | ||||
| @@ -239,38 +236,34 @@ impl Index { | ||||
|             let hit = SearchHit { | ||||
|                 document, | ||||
|                 formatted, | ||||
|                 matches_info, | ||||
|                 matches_position, | ||||
|             }; | ||||
|             documents.push(hit); | ||||
|         } | ||||
|  | ||||
|         let nb_hits = candidates.len(); | ||||
|         let estimated_total_hits = candidates.len(); | ||||
|  | ||||
|         let facets_distribution = match query.facets_distribution { | ||||
|         let facet_distribution = match query.facets { | ||||
|             Some(ref fields) => { | ||||
|                 let mut facets_distribution = self.facets_distribution(&rtxn); | ||||
|                 let mut facet_distribution = self.facets_distribution(&rtxn); | ||||
|                 if fields.iter().all(|f| f != "*") { | ||||
|                     facets_distribution.facets(fields); | ||||
|                     facet_distribution.facets(fields); | ||||
|                 } | ||||
|                 let distribution = facets_distribution.candidates(candidates).execute()?; | ||||
|                 let distribution = facet_distribution.candidates(candidates).execute()?; | ||||
|  | ||||
|                 Some(distribution) | ||||
|             } | ||||
|             None => None, | ||||
|         }; | ||||
|  | ||||
|         let exhaustive_facets_count = facets_distribution.as_ref().map(|_| false); // not implemented yet | ||||
|  | ||||
|         let result = SearchResult { | ||||
|             exhaustive_nb_hits: false, // not implemented yet | ||||
|             hits: documents, | ||||
|             nb_hits, | ||||
|             estimated_total_hits, | ||||
|             query: query.q.clone().unwrap_or_default(), | ||||
|             limit: query.limit, | ||||
|             offset: query.offset.unwrap_or_default(), | ||||
|             processing_time_ms: before_search.elapsed().as_millis(), | ||||
|             facets_distribution, | ||||
|             exhaustive_facets_count, | ||||
|             facet_distribution, | ||||
|         }; | ||||
|         Ok(result) | ||||
|     } | ||||
| @@ -445,8 +438,8 @@ fn format_fields<'a, A: AsRef<[u8]>>( | ||||
|     formatted_options: &BTreeMap<FieldId, FormatOptions>, | ||||
|     compute_matches: bool, | ||||
|     displayable_ids: &BTreeSet<FieldId>, | ||||
| ) -> Result<(Option<MatchesInfo>, Document)> { | ||||
|     let mut matches = compute_matches.then(BTreeMap::new); | ||||
| ) -> Result<(Option<MatchesPosition>, Document)> { | ||||
|     let mut matches_position = compute_matches.then(BTreeMap::new); | ||||
|     let mut document = document.clone(); | ||||
|  | ||||
|     // select the attributes to retrieve | ||||
| @@ -477,7 +470,7 @@ fn format_fields<'a, A: AsRef<[u8]>>( | ||||
|             compute_matches, | ||||
|         ); | ||||
|  | ||||
|         if let Some(matches) = matches.as_mut() { | ||||
|         if let Some(matches) = matches_position.as_mut() { | ||||
|             if !infos.is_empty() { | ||||
|                 matches.insert(key.to_owned(), infos); | ||||
|             } | ||||
| @@ -491,7 +484,7 @@ fn format_fields<'a, A: AsRef<[u8]>>( | ||||
|         .map(|&fid| field_ids_map.name(fid).unwrap()); | ||||
|     let document = permissive_json_pointer::select_values(&document, selectors); | ||||
|  | ||||
|     Ok((matches, document)) | ||||
|     Ok((matches_position, document)) | ||||
| } | ||||
|  | ||||
| fn format_value<'a, A: AsRef<[u8]>>( | ||||
|   | ||||
| @@ -687,10 +687,10 @@ mod test { | ||||
|             attributes_to_crop: None, | ||||
|             crop_length: 18, | ||||
|             attributes_to_highlight: None, | ||||
|             matches: true, | ||||
|             show_matches_position: true, | ||||
|             filter: None, | ||||
|             sort: None, | ||||
|             facets_distribution: None, | ||||
|             facets: None, | ||||
|             highlight_pre_tag: default_highlight_pre_tag(), | ||||
|             highlight_post_tag: default_highlight_post_tag(), | ||||
|             crop_marker: default_crop_marker(), | ||||
| @@ -698,14 +698,12 @@ mod test { | ||||
|  | ||||
|         let result = SearchResult { | ||||
|             hits: vec![], | ||||
|             nb_hits: 29, | ||||
|             exhaustive_nb_hits: true, | ||||
|             estimated_total_hits: 29, | ||||
|             query: "hello world".to_string(), | ||||
|             limit: 24, | ||||
|             offset: 0, | ||||
|             processing_time_ms: 50, | ||||
|             facets_distribution: None, | ||||
|             exhaustive_facets_count: Some(true), | ||||
|             facet_distribution: None, | ||||
|         }; | ||||
|  | ||||
|         let mut uuid_store = MockIndexMetaStore::new(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user