mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-21 22:00:59 +00:00
Compare commits
11 Commits
tmp-spawn-
...
v0.30.0-pa
Author | SHA1 | Date | |
---|---|---|---|
f908701085 | |||
35c7077e75 | |||
e49d47a7ac | |||
b25ebff7dc | |||
aa36ef20f4 | |||
ba3eca9d72 | |||
63eae8eedd | |||
94b2206fca | |||
0012c42d43 | |||
2ee47cd2d3 | |||
983170c787 |
16
Cargo.lock
generated
16
Cargo.lock
generated
@ -1119,8 +1119,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "filter-parser"
|
name = "filter-parser"
|
||||||
version = "0.33.0"
|
version = "0.33.4"
|
||||||
source = "git+https://github.com/meilisearch/milli.git?tag=v0.33.0#a79ff8a1a98a807f40f970131c8de2ab11560de5"
|
source = "git+https://github.com/meilisearch/milli.git?branch=ease-search-results-pagination#c94c38e9365179785ba2c74bfcc4db6f229cc860"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nom",
|
"nom",
|
||||||
"nom_locate",
|
"nom_locate",
|
||||||
@ -1144,8 +1144,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flatten-serde-json"
|
name = "flatten-serde-json"
|
||||||
version = "0.33.0"
|
version = "0.33.4"
|
||||||
source = "git+https://github.com/meilisearch/milli.git?tag=v0.33.0#a79ff8a1a98a807f40f970131c8de2ab11560de5"
|
source = "git+https://github.com/meilisearch/milli.git?branch=ease-search-results-pagination#c94c38e9365179785ba2c74bfcc4db6f229cc860"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
@ -1657,8 +1657,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "json-depth-checker"
|
name = "json-depth-checker"
|
||||||
version = "0.33.0"
|
version = "0.33.4"
|
||||||
source = "git+https://github.com/meilisearch/milli.git?tag=v0.33.0#a79ff8a1a98a807f40f970131c8de2ab11560de5"
|
source = "git+https://github.com/meilisearch/milli.git?branch=ease-search-results-pagination#c94c38e9365179785ba2c74bfcc4db6f229cc860"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
@ -2195,8 +2195,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "milli"
|
name = "milli"
|
||||||
version = "0.33.0"
|
version = "0.33.4"
|
||||||
source = "git+https://github.com/meilisearch/milli.git?tag=v0.33.0#a79ff8a1a98a807f40f970131c8de2ab11560de5"
|
source = "git+https://github.com/meilisearch/milli.git?branch=ease-search-results-pagination#c94c38e9365179785ba2c74bfcc4db6f229cc860"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bimap",
|
"bimap",
|
||||||
"bincode",
|
"bincode",
|
||||||
|
@ -7,7 +7,7 @@ edition = "2021"
|
|||||||
enum-iterator = "0.7.0"
|
enum-iterator = "0.7.0"
|
||||||
hmac = "0.12.1"
|
hmac = "0.12.1"
|
||||||
meilisearch-types = { path = "../meilisearch-types" }
|
meilisearch-types = { path = "../meilisearch-types" }
|
||||||
milli = { git = "https://github.com/meilisearch/milli.git", tag = "v0.33.0" }
|
milli = { git = "https://github.com/meilisearch/milli.git", branch = "ease-search-results-pagination" }
|
||||||
rand = "0.8.4"
|
rand = "0.8.4"
|
||||||
serde = { version = "1.0.136", features = ["derive"] }
|
serde = { version = "1.0.136", features = ["derive"] }
|
||||||
serde_json = { version = "1.0.85", features = ["preserve_order"] }
|
serde_json = { version = "1.0.85", features = ["preserve_order"] }
|
||||||
|
@ -10,7 +10,7 @@ use http::header::CONTENT_TYPE;
|
|||||||
use meilisearch_auth::SearchRules;
|
use meilisearch_auth::SearchRules;
|
||||||
use meilisearch_lib::index::{
|
use meilisearch_lib::index::{
|
||||||
SearchQuery, SearchResult, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
SearchQuery, SearchResult, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
||||||
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG,
|
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
||||||
};
|
};
|
||||||
use meilisearch_lib::index_controller::Stats;
|
use meilisearch_lib::index_controller::Stats;
|
||||||
use meilisearch_lib::MeiliSearch;
|
use meilisearch_lib::MeiliSearch;
|
||||||
@ -270,8 +270,8 @@ impl Segment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn run(mut self, meilisearch: MeiliSearch) {
|
async fn run(mut self, meilisearch: MeiliSearch) {
|
||||||
const INTERVAL: Duration = Duration::from_secs(60 * 60); // one hour
|
const INTERVAL: Duration = Duration::from_secs(60); // one minute
|
||||||
// The first batch must be sent after one hour.
|
// The first batch must be sent after one minute.
|
||||||
let mut interval =
|
let mut interval =
|
||||||
tokio::time::interval_at(tokio::time::Instant::now() + INTERVAL, INTERVAL);
|
tokio::time::interval_at(tokio::time::Instant::now() + INTERVAL, INTERVAL);
|
||||||
|
|
||||||
@ -301,7 +301,7 @@ impl Segment {
|
|||||||
.push(Identify {
|
.push(Identify {
|
||||||
context: Some(json!({
|
context: Some(json!({
|
||||||
"app": {
|
"app": {
|
||||||
"version": env!("CARGO_PKG_VERSION").to_string(),
|
"version": "prototype-pagination-4".to_string(),
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
user: self.user.clone(),
|
user: self.user.clone(),
|
||||||
@ -372,6 +372,7 @@ pub struct SearchAggregator {
|
|||||||
// pagination
|
// pagination
|
||||||
max_limit: usize,
|
max_limit: usize,
|
||||||
max_offset: usize,
|
max_offset: usize,
|
||||||
|
finite_pagination: usize,
|
||||||
|
|
||||||
// formatting
|
// formatting
|
||||||
highlight_pre_tag: bool,
|
highlight_pre_tag: bool,
|
||||||
@ -426,12 +427,19 @@ impl SearchAggregator {
|
|||||||
ret.max_terms_number = q.split_whitespace().count();
|
ret.max_terms_number = q.split_whitespace().count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if query.limit.is_none() && query.offset.is_none() {
|
||||||
|
ret.max_limit = query.hits_per_page;
|
||||||
|
ret.max_offset = query.page.saturating_sub(1) * query.hits_per_page;
|
||||||
|
ret.finite_pagination = 1;
|
||||||
|
} else {
|
||||||
|
ret.max_limit = query.limit.unwrap_or_else(DEFAULT_SEARCH_LIMIT);
|
||||||
|
ret.max_offset = query.offset.unwrap_or_default();
|
||||||
|
ret.finite_pagination = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ret.matching_strategy
|
ret.matching_strategy
|
||||||
.insert(format!("{:?}", query.matching_strategy), 1);
|
.insert(format!("{:?}", query.matching_strategy), 1);
|
||||||
|
|
||||||
ret.max_limit = query.limit;
|
|
||||||
ret.max_offset = query.offset.unwrap_or_default();
|
|
||||||
|
|
||||||
ret.highlight_pre_tag = query.highlight_pre_tag != DEFAULT_HIGHLIGHT_PRE_TAG();
|
ret.highlight_pre_tag = query.highlight_pre_tag != DEFAULT_HIGHLIGHT_PRE_TAG();
|
||||||
ret.highlight_post_tag = query.highlight_post_tag != DEFAULT_HIGHLIGHT_POST_TAG();
|
ret.highlight_post_tag = query.highlight_post_tag != DEFAULT_HIGHLIGHT_POST_TAG();
|
||||||
ret.crop_marker = query.crop_marker != DEFAULT_CROP_MARKER();
|
ret.crop_marker = query.crop_marker != DEFAULT_CROP_MARKER();
|
||||||
@ -490,6 +498,7 @@ impl SearchAggregator {
|
|||||||
// 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);
|
||||||
|
self.finite_pagination += other.finite_pagination;
|
||||||
|
|
||||||
self.highlight_pre_tag |= other.highlight_pre_tag;
|
self.highlight_pre_tag |= other.highlight_pre_tag;
|
||||||
self.highlight_post_tag |= other.highlight_post_tag;
|
self.highlight_post_tag |= other.highlight_post_tag;
|
||||||
@ -533,6 +542,7 @@ impl SearchAggregator {
|
|||||||
"pagination": {
|
"pagination": {
|
||||||
"max_limit": self.max_limit,
|
"max_limit": self.max_limit,
|
||||||
"max_offset": self.max_offset,
|
"max_offset": self.max_offset,
|
||||||
|
"finite_pagination": self.finite_pagination > self.total_received / 2,
|
||||||
},
|
},
|
||||||
"formatting": {
|
"formatting": {
|
||||||
"highlight_pre_tag": self.highlight_pre_tag,
|
"highlight_pre_tag": self.highlight_pre_tag,
|
||||||
|
@ -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::{
|
||||||
MatchingStrategy, SearchQuery, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
SearchQuery, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG,
|
||||||
DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT,
|
DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_HIT_PER_PAGE, DEFAULT_PAGE, MatchingStrategy
|
||||||
};
|
};
|
||||||
use meilisearch_lib::MeiliSearch;
|
use meilisearch_lib::MeiliSearch;
|
||||||
use meilisearch_types::error::ResponseError;
|
use meilisearch_types::error::ResponseError;
|
||||||
@ -29,6 +29,10 @@ pub struct SearchQueryGet {
|
|||||||
q: Option<String>,
|
q: Option<String>,
|
||||||
offset: Option<usize>,
|
offset: Option<usize>,
|
||||||
limit: Option<usize>,
|
limit: Option<usize>,
|
||||||
|
#[serde(default = "DEFAULT_PAGE")]
|
||||||
|
page: usize,
|
||||||
|
#[serde(default = "DEFAULT_HIT_PER_PAGE")]
|
||||||
|
hits_per_page: usize,
|
||||||
attributes_to_retrieve: Option<CS<String>>,
|
attributes_to_retrieve: Option<CS<String>>,
|
||||||
attributes_to_crop: Option<CS<String>>,
|
attributes_to_crop: Option<CS<String>>,
|
||||||
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
||||||
@ -62,7 +66,9 @@ impl From<SearchQueryGet> for SearchQuery {
|
|||||||
Self {
|
Self {
|
||||||
q: other.q,
|
q: other.q,
|
||||||
offset: other.offset,
|
offset: other.offset,
|
||||||
limit: other.limit.unwrap_or_else(DEFAULT_SEARCH_LIMIT),
|
limit: other.limit,
|
||||||
|
page: other.page,
|
||||||
|
hits_per_page: other.hits_per_page,
|
||||||
attributes_to_retrieve: other
|
attributes_to_retrieve: other
|
||||||
.attributes_to_retrieve
|
.attributes_to_retrieve
|
||||||
.map(|o| o.into_iter().collect()),
|
.map(|o| o.into_iter().collect()),
|
||||||
|
@ -28,7 +28,7 @@ lazy_static = "1.4.0"
|
|||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
meilisearch-auth = { path = "../meilisearch-auth" }
|
meilisearch-auth = { path = "../meilisearch-auth" }
|
||||||
meilisearch-types = { path = "../meilisearch-types" }
|
meilisearch-types = { path = "../meilisearch-types" }
|
||||||
milli = { git = "https://github.com/meilisearch/milli.git", tag = "v0.33.0" }
|
milli = { git = "https://github.com/meilisearch/milli.git", branch = "ease-search-results-pagination" }
|
||||||
mime = "0.3.16"
|
mime = "0.3.16"
|
||||||
num_cpus = "1.13.1"
|
num_cpus = "1.13.1"
|
||||||
obkv = "0.2.0"
|
obkv = "0.2.0"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
pub use search::{
|
pub use search::{
|
||||||
MatchingStrategy, SearchQuery, SearchResult, DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER,
|
HitsInfo, 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_HIT_PER_PAGE, DEFAULT_PAGE,
|
||||||
|
DEFAULT_SEARCH_LIMIT, MatchingStrategy
|
||||||
};
|
};
|
||||||
pub use updates::{apply_settings_to_builder, Checked, Facets, Settings, Unchecked};
|
pub use updates::{apply_settings_to_builder, Checked, Facets, Settings, Unchecked};
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@ pub const DEFAULT_CROP_LENGTH: fn() -> usize = || 10;
|
|||||||
pub const DEFAULT_CROP_MARKER: fn() -> String = || "…".to_string();
|
pub const DEFAULT_CROP_MARKER: fn() -> String = || "…".to_string();
|
||||||
pub const DEFAULT_HIGHLIGHT_PRE_TAG: fn() -> String = || "<em>".to_string();
|
pub const DEFAULT_HIGHLIGHT_PRE_TAG: fn() -> String = || "<em>".to_string();
|
||||||
pub const DEFAULT_HIGHLIGHT_POST_TAG: fn() -> String = || "</em>".to_string();
|
pub const DEFAULT_HIGHLIGHT_POST_TAG: fn() -> String = || "</em>".to_string();
|
||||||
|
pub const DEFAULT_PAGE: fn() -> usize = || 1;
|
||||||
|
pub const DEFAULT_HIT_PER_PAGE: fn() -> usize = || 20;
|
||||||
|
|
||||||
/// The maximimum number of results that the engine
|
/// The maximimum number of results that the engine
|
||||||
/// will be able to return in one search call.
|
/// will be able to return in one search call.
|
||||||
@ -36,8 +38,11 @@ pub const DEFAULT_PAGINATION_MAX_TOTAL_HITS: usize = 1000;
|
|||||||
pub struct SearchQuery {
|
pub struct SearchQuery {
|
||||||
pub q: Option<String>,
|
pub q: Option<String>,
|
||||||
pub offset: Option<usize>,
|
pub offset: Option<usize>,
|
||||||
#[serde(default = "DEFAULT_SEARCH_LIMIT")]
|
pub limit: Option<usize>,
|
||||||
pub limit: usize,
|
#[serde(default = "DEFAULT_PAGE")]
|
||||||
|
pub page: usize,
|
||||||
|
#[serde(default = "DEFAULT_HIT_PER_PAGE")]
|
||||||
|
pub hits_per_page: usize,
|
||||||
pub attributes_to_retrieve: Option<BTreeSet<String>>,
|
pub attributes_to_retrieve: Option<BTreeSet<String>>,
|
||||||
pub attributes_to_crop: Option<Vec<String>>,
|
pub attributes_to_crop: Option<Vec<String>>,
|
||||||
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
||||||
@ -97,15 +102,32 @@ pub struct SearchHit {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct SearchResult {
|
pub struct SearchResult {
|
||||||
pub hits: Vec<SearchHit>,
|
pub hits: Vec<SearchHit>,
|
||||||
pub estimated_total_hits: u64,
|
|
||||||
pub query: String,
|
pub query: String,
|
||||||
pub limit: usize,
|
|
||||||
pub offset: usize,
|
|
||||||
pub processing_time_ms: u128,
|
pub processing_time_ms: u128,
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub hits_info: HitsInfo,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub facet_distribution: Option<BTreeMap<String, BTreeMap<String, u64>>>,
|
pub facet_distribution: Option<BTreeMap<String, BTreeMap<String, u64>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Debug, Clone, PartialEq)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
pub enum HitsInfo {
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
Pagination {
|
||||||
|
hits_per_page: usize,
|
||||||
|
page: usize,
|
||||||
|
total_pages: usize,
|
||||||
|
total_hits: usize,
|
||||||
|
},
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
OffsetLimit {
|
||||||
|
limit: usize,
|
||||||
|
offset: usize,
|
||||||
|
estimated_total_hits: usize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
impl Index {
|
impl Index {
|
||||||
pub fn perform_search(&self, query: SearchQuery) -> Result<SearchResult> {
|
pub fn perform_search(&self, query: SearchQuery) -> Result<SearchResult> {
|
||||||
let before_search = Instant::now();
|
let before_search = Instant::now();
|
||||||
@ -125,8 +147,30 @@ impl Index {
|
|||||||
|
|
||||||
// Make sure that a user can't get more documents than the hard limit,
|
// Make sure that a user can't get more documents than the hard limit,
|
||||||
// we align that on the offset too.
|
// we align that on the offset too.
|
||||||
let offset = min(query.offset.unwrap_or(0), max_total_hits);
|
let is_finite_pagination = query.offset.is_none() && query.limit.is_none();
|
||||||
let limit = min(query.limit, max_total_hits.saturating_sub(offset));
|
|
||||||
|
search.exhaustive_number_hits(is_finite_pagination);
|
||||||
|
|
||||||
|
let (offset, limit) = if is_finite_pagination {
|
||||||
|
match query.page.checked_sub(1) {
|
||||||
|
Some(page) => {
|
||||||
|
let offset = min(query.hits_per_page * page, max_total_hits);
|
||||||
|
let limit = min(query.hits_per_page, max_total_hits.saturating_sub(offset));
|
||||||
|
|
||||||
|
(offset, limit)
|
||||||
|
}
|
||||||
|
// page 0 returns 0 hits
|
||||||
|
None => (0, 0),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let offset = min(query.offset.unwrap_or(0), max_total_hits);
|
||||||
|
let limit = min(
|
||||||
|
query.limit.unwrap_or_else(DEFAULT_SEARCH_LIMIT),
|
||||||
|
max_total_hits.saturating_sub(offset),
|
||||||
|
);
|
||||||
|
|
||||||
|
(offset, limit)
|
||||||
|
};
|
||||||
|
|
||||||
search.offset(offset);
|
search.offset(offset);
|
||||||
search.limit(limit);
|
search.limit(limit);
|
||||||
@ -251,7 +295,26 @@ impl Index {
|
|||||||
documents.push(hit);
|
documents.push(hit);
|
||||||
}
|
}
|
||||||
|
|
||||||
let estimated_total_hits = candidates.len();
|
let number_of_hits = min(candidates.len() as usize, max_total_hits);
|
||||||
|
let hits_info = if is_finite_pagination {
|
||||||
|
// If hit_per_page is 0, then pages can't be computed and so we respond 0.
|
||||||
|
let total_pages = (number_of_hits + query.hits_per_page.saturating_sub(1))
|
||||||
|
.checked_div(query.hits_per_page)
|
||||||
|
.unwrap_or(0);
|
||||||
|
|
||||||
|
HitsInfo::Pagination {
|
||||||
|
hits_per_page: query.hits_per_page,
|
||||||
|
page: query.page,
|
||||||
|
total_pages,
|
||||||
|
total_hits: number_of_hits,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
HitsInfo::OffsetLimit {
|
||||||
|
limit: query.limit.unwrap_or_else(DEFAULT_SEARCH_LIMIT),
|
||||||
|
offset,
|
||||||
|
estimated_total_hits: number_of_hits,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let facet_distribution = match query.facets {
|
let facet_distribution = match query.facets {
|
||||||
Some(ref fields) => {
|
Some(ref fields) => {
|
||||||
@ -274,10 +337,8 @@ impl Index {
|
|||||||
|
|
||||||
let result = SearchResult {
|
let result = SearchResult {
|
||||||
hits: documents,
|
hits: documents,
|
||||||
estimated_total_hits,
|
hits_info,
|
||||||
query: query.q.clone().unwrap_or_default(),
|
query: query.q.clone().unwrap_or_default(),
|
||||||
limit: query.limit,
|
|
||||||
offset: query.offset.unwrap_or_default(),
|
|
||||||
processing_time_ms: before_search.elapsed().as_millis(),
|
processing_time_ms: before_search.elapsed().as_millis(),
|
||||||
facet_distribution,
|
facet_distribution,
|
||||||
};
|
};
|
||||||
|
@ -659,7 +659,7 @@ mod test {
|
|||||||
use nelson::Mocker;
|
use nelson::Mocker;
|
||||||
|
|
||||||
use crate::index::error::Result as IndexResult;
|
use crate::index::error::Result as IndexResult;
|
||||||
use crate::index::Index;
|
use crate::index::{HitsInfo, Index};
|
||||||
use crate::index::{
|
use crate::index::{
|
||||||
DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG,
|
DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG,
|
||||||
};
|
};
|
||||||
@ -692,7 +692,9 @@ mod test {
|
|||||||
let query = SearchQuery {
|
let query = SearchQuery {
|
||||||
q: Some(String::from("hello world")),
|
q: Some(String::from("hello world")),
|
||||||
offset: Some(10),
|
offset: Some(10),
|
||||||
limit: 0,
|
limit: Some(0),
|
||||||
|
page: 1,
|
||||||
|
hits_per_page: 10,
|
||||||
attributes_to_retrieve: Some(vec!["string".to_owned()].into_iter().collect()),
|
attributes_to_retrieve: Some(vec!["string".to_owned()].into_iter().collect()),
|
||||||
attributes_to_crop: None,
|
attributes_to_crop: None,
|
||||||
crop_length: 18,
|
crop_length: 18,
|
||||||
@ -709,10 +711,12 @@ mod test {
|
|||||||
|
|
||||||
let result = SearchResult {
|
let result = SearchResult {
|
||||||
hits: vec![],
|
hits: vec![],
|
||||||
estimated_total_hits: 29,
|
|
||||||
query: "hello world".to_string(),
|
query: "hello world".to_string(),
|
||||||
limit: 24,
|
hits_info: HitsInfo::OffsetLimit {
|
||||||
offset: 0,
|
limit: 24,
|
||||||
|
offset: 0,
|
||||||
|
estimated_total_hits: 29,
|
||||||
|
},
|
||||||
processing_time_ms: 50,
|
processing_time_ms: 50,
|
||||||
facet_distribution: None,
|
facet_distribution: None,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user