727: Fix bug in filter search r=Kerollmops a=loiclec

# Pull Request

## Related issue
Fixes (partially, until merged into meilisearch) https://github.com/meilisearch/meilisearch/issues/3178

## What does this PR do?
The most important change is this one:
```rust
    // in milli/src/search/facet/facet_range_search.rs, line 239
    let should_stop = {
        match self.right {
            Bound::Included(right) => right < previous_key.left_bound,
            Bound::Excluded(right) => right <= previous_key.left_bound,
            Bound::Unbounded => false,
        }
    };
```
where the operations `<` and `<=` between the two branches were switched. This caused (very few) documents to be missing from filter results.

The second change is a simplification of the algorithm for filters such as `field = value`, where we now perform a direct query into the "Level 0" of the facet db to retrieve the docids instead of invoking the full facet search algorithm. This change is done in `milli/src/search/facet/filter.rs`.

I have added yet more insta-snapshot tests, rechecked the content of the snapshots, and added some integration tests as well. 

This is purely a fix in the search algorithms. Based on this PR alone, a dump will not be necessary to switch from v0.30.1 (where this bug is present) to v0.30.2 (where this PR is merged).


Co-authored-by: Loïc Lecrenier <loic.lecrenier@me.com>
This commit is contained in:
bors[bot] 2022-12-07 14:34:59 +00:00 committed by GitHub
commit 098c410612
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
51 changed files with 899 additions and 94 deletions

View File

@ -171,6 +171,8 @@ impl<'t, 'b, 'bitmap> FacetRangeSearch<'t, 'b, 'bitmap> {
}
// should we stop?
// We should if the the search range doesn't include any
// element from the previous key or its successors
let should_stop = {
match self.right {
Bound::Included(right) => right < previous_key.left_bound,
@ -233,10 +235,12 @@ impl<'t, 'b, 'bitmap> FacetRangeSearch<'t, 'b, 'bitmap> {
}
// should we stop?
// We should if the the search range doesn't include any
// element from the previous key or its successors
let should_stop = {
match self.right {
Bound::Included(right) => right <= previous_key.left_bound,
Bound::Excluded(right) => right < previous_key.left_bound,
Bound::Included(right) => right < previous_key.left_bound,
Bound::Excluded(right) => right <= previous_key.left_bound,
Bound::Unbounded => false,
}
};
@ -321,8 +325,27 @@ mod tests {
#[test]
fn random_looking_index_snap() {
let index = get_random_looking_index();
milli_snap!(format!("{index}"));
milli_snap!(format!("{index}"), @"3256c76a7c1b768a013e78d5fa6e9ff9");
}
#[test]
fn random_looking_index_with_multiple_field_ids_snap() {
let index = get_random_looking_index_with_multiple_field_ids();
milli_snap!(format!("{index}"), @"c3e5fe06a8f1c404ed4935b32c90a89b");
}
#[test]
fn simple_index_snap() {
let index = get_simple_index();
milli_snap!(format!("{index}"), @"5dbfa134cc44abeb3ab6242fc182e48e");
}
#[test]
fn simple_index_with_multiple_field_ids_snap() {
let index = get_simple_index_with_multiple_field_ids();
milli_snap!(format!("{index}"), @"a4893298218f682bc76357f46777448c");
}
#[test]
fn filter_range_increasing() {
let indexes = [
@ -349,7 +372,7 @@ mod tests {
)
.unwrap();
#[allow(clippy::format_push_string)]
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!("0 <= . <= {i} : {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("included_{i}"));
let mut results = String::new();
@ -368,7 +391,7 @@ mod tests {
)
.unwrap();
#[allow(clippy::format_push_string)]
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!("0 < . < {i} : {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("excluded_{i}"));
txn.commit().unwrap();
@ -401,7 +424,7 @@ mod tests {
&mut docids,
)
.unwrap();
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!("{i} <= . <= 255 : {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("included_{i}"));
@ -422,7 +445,7 @@ mod tests {
&mut docids,
)
.unwrap();
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!("{i} < . < 255 : {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("excluded_{i}"));
@ -457,7 +480,11 @@ mod tests {
&mut docids,
)
.unwrap();
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!(
"{i} <= . <= {r} : {docids}\n",
r = 255. - i,
docids = display_bitmap(&docids)
));
}
milli_snap!(results, format!("included_{i}"));
@ -478,7 +505,11 @@ mod tests {
&mut docids,
)
.unwrap();
results.push_str(&format!("{}\n", display_bitmap(&docids)));
results.push_str(&format!(
"{i} < . < {r} {docids}\n",
r = 255. - i,
docids = display_bitmap(&docids)
));
}
milli_snap!(results, format!("excluded_{i}"));
@ -486,4 +517,136 @@ mod tests {
txn.commit().unwrap();
}
}
#[test]
fn filter_range_unbounded() {
let indexes = [
get_simple_index(),
get_random_looking_index(),
get_simple_index_with_multiple_field_ids(),
get_random_looking_index_with_multiple_field_ids(),
];
for (i, index) in indexes.iter().enumerate() {
let txn = index.env.read_txn().unwrap();
let mut results = String::new();
for i in 0..=255 {
let i = i as f64;
let start = Bound::Included(i);
let end = Bound::Unbounded;
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
0,
&start,
&end,
&mut docids,
)
.unwrap();
#[allow(clippy::format_push_string)]
results.push_str(&format!(">= {i}: {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("start_from_included_{i}"));
let mut results = String::new();
for i in 0..=255 {
let i = i as f64;
let start = Bound::Unbounded;
let end = Bound::Included(i);
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
0,
&start,
&end,
&mut docids,
)
.unwrap();
#[allow(clippy::format_push_string)]
results.push_str(&format!("<= {i}: {}\n", display_bitmap(&docids)));
}
milli_snap!(results, format!("end_at_included_{i}"));
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
0,
&Bound::Unbounded,
&Bound::Unbounded,
&mut docids,
)
.unwrap();
milli_snap!(
&format!("all field_id 0: {}\n", display_bitmap(&docids)),
format!("unbounded_field_id_0_{i}")
);
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
1,
&Bound::Unbounded,
&Bound::Unbounded,
&mut docids,
)
.unwrap();
milli_snap!(
&format!("all field_id 1: {}\n", display_bitmap(&docids)),
format!("unbounded_field_id_1_{i}")
);
drop(txn);
}
}
#[test]
fn filter_range_exact() {
let indexes = [
get_simple_index(),
get_random_looking_index(),
get_simple_index_with_multiple_field_ids(),
get_random_looking_index_with_multiple_field_ids(),
];
for (i, index) in indexes.iter().enumerate() {
let txn = index.env.read_txn().unwrap();
let mut results_0 = String::new();
let mut results_1 = String::new();
for i in 0..=255 {
let i = i as f64;
let start = Bound::Included(i);
let end = Bound::Included(i);
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
0,
&start,
&end,
&mut docids,
)
.unwrap();
#[allow(clippy::format_push_string)]
results_0.push_str(&format!("{i}: {}\n", display_bitmap(&docids)));
let mut docids = RoaringBitmap::new();
find_docids_of_facet_within_bounds::<OrderedF64Codec>(
&txn,
index.content.remap_key_type::<FacetGroupKeyCodec<OrderedF64Codec>>(),
1,
&start,
&end,
&mut docids,
)
.unwrap();
#[allow(clippy::format_push_string)]
results_1.push_str(&format!("{i}: {}\n", display_bitmap(&docids)));
}
milli_snap!(results_0, format!("field_id_0_exact_{i}"));
milli_snap!(results_1, format!("field_id_1_exact_{i}"));
drop(txn);
}
}
}

View File

@ -4,7 +4,6 @@ use std::ops::Bound::{self, Excluded, Included};
use either::Either;
pub use filter_parser::{Condition, Error as FPError, FilterCondition, Span, Token};
use heed::types::DecodeIgnore;
use roaring::RoaringBitmap;
use super::facet_range_search;
@ -200,20 +199,10 @@ impl<'a> Filter<'a> {
.unwrap_or_default();
let number = val.parse_finite_float().ok();
let number_docids = match number {
Some(n) => {
let n = Included(n);
let mut output = RoaringBitmap::new();
Self::explore_facet_number_levels(
rtxn,
numbers_db,
field_id,
0,
n,
n,
&mut output,
)?;
output
}
Some(n) => numbers_db
.get(rtxn, &FacetGroupKey { field_id, level: 0, left_bound: n })?
.map(|v| v.bitmap)
.unwrap_or_default(),
None => RoaringBitmap::new(),
};
return Ok(string_docids | number_docids);
@ -226,40 +215,9 @@ impl<'a> Filter<'a> {
}
};
// Ask for the biggest value that can exist for this specific field, if it exists
// that's fine if it don't, the value just before will be returned instead.
let biggest_level = numbers_db
.remap_data_type::<DecodeIgnore>()
.get_lower_than_or_equal_to(
rtxn,
&FacetGroupKey { field_id, level: u8::MAX, left_bound: f64::MAX },
)?
.and_then(
|(FacetGroupKey { field_id: id, level, .. }, _)| {
if id == field_id {
Some(level)
} else {
None
}
},
);
match biggest_level {
Some(level) => {
let mut output = RoaringBitmap::new();
Self::explore_facet_number_levels(
rtxn,
numbers_db,
field_id,
level,
left,
right,
&mut output,
)?;
Ok(output)
}
None => Ok(RoaringBitmap::new()),
}
let mut output = RoaringBitmap::new();
Self::explore_facet_number_levels(rtxn, numbers_db, field_id, left, right, &mut output)?;
Ok(output)
}
/// Aggregates the documents ids that are part of the specified range automatically
@ -268,18 +226,11 @@ impl<'a> Filter<'a> {
rtxn: &heed::RoTxn,
db: heed::Database<FacetGroupKeyCodec<OrderedF64Codec>, FacetGroupValueCodec>,
field_id: FieldId,
level: u8,
left: Bound<f64>,
right: Bound<f64>,
output: &mut RoaringBitmap,
) -> Result<()> {
match (left, right) {
// If the request is an exact value we must go directly to the deepest level.
(Included(l), Included(r)) if l == r && level > 0 => {
return Self::explore_facet_number_levels(
rtxn, db, field_id, 0, left, right, output,
);
}
// lower TO upper when lower > upper must return no result
(Included(l), Included(r)) if l > r => return Ok(()),
(Included(l), Excluded(r)) if l >= r => return Ok(()),
@ -447,10 +398,12 @@ impl<'a> From<FilterCondition<'a>> for Filter<'a> {
#[cfg(test)]
mod tests {
use std::fmt::Write;
use std::iter::FromIterator;
use big_s::S;
use either::Either;
use maplit::hashset;
use roaring::RoaringBitmap;
use crate::index::tests::TempIndex;
use crate::Filter;
@ -801,4 +754,85 @@ mod tests {
Err(crate::Error::UserError(crate::error::UserError::InvalidFilter(_)))
));
}
#[test]
fn filter_number() {
let index = TempIndex::new();
index
.update_settings(|settings| {
settings.set_primary_key("id".to_owned());
settings.set_filterable_fields(hashset! { S("id"), S("one"), S("two") });
})
.unwrap();
let mut docs = vec![];
for i in 0..100 {
docs.push(serde_json::json!({ "id": i, "two": i % 10 }));
}
index.add_documents(documents!(docs)).unwrap();
let rtxn = index.read_txn().unwrap();
for i in 0..100 {
let filter_str = format!("id = {i}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter([i]));
}
for i in 0..100 {
let filter_str = format!("id > {i}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter((i + 1)..100));
}
for i in 0..100 {
let filter_str = format!("id < {i}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter(0..i));
}
for i in 0..100 {
let filter_str = format!("id <= {i}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter(0..=i));
}
for i in 0..100 {
let filter_str = format!("id >= {i}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter(i..100));
}
for i in 0..100 {
for j in i..100 {
let filter_str = format!("id {i} TO {j}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter(i..=j));
}
}
let filter = Filter::from_str("one >= 0 OR one <= 0").unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::default());
let filter = Filter::from_str("one = 0").unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::default());
for i in 0..10 {
for j in i..10 {
let filter_str = format!("two {i} TO {j}");
let filter = Filter::from_str(&filter_str).unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(
result,
RoaringBitmap::from_iter((0..100).filter(|x| (i..=j).contains(&(x % 10))))
);
}
}
let filter = Filter::from_str("two != 0").unwrap().unwrap();
let result = filter.evaluate(&rtxn, &index).unwrap();
assert_eq!(result, RoaringBitmap::from_iter((0..100).filter(|x| x % 10 != 0)));
}
}

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
fcedc563a82c1c61f50174a5f3f982b6
adf484f467a31ee9460dec539621938a

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
6cc26e77fc6bd9145deedf14cf422b03
c9939aa4977fcd4bfd35852e102dbc82

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
fcedc563a82c1c61f50174a5f3f982b6
adf484f467a31ee9460dec539621938a

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
6cc26e77fc6bd9145deedf14cf422b03
c9939aa4977fcd4bfd35852e102dbc82

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
57d35cfa419a19a1a1f8d7c8ef096e0f
618738d28ff1386b6e93d171a5acb08f

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
3dbe0547b42759795e9b16989df72cee
ffb62ab3eef55c2254c13dc0f4099849

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
57d35cfa419a19a1a1f8d7c8ef096e0f
618738d28ff1386b6e93d171a5acb08f

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
3dbe0547b42759795e9b16989df72cee
ffb62ab3eef55c2254c13dc0f4099849

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
3256c76a7c1b768a013e78d5fa6e9ff9
9c25261cec7275cb5cfd85835904d023

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
2f97f18c15e915853e4df879be6e1f63

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
9c25261cec7275cb5cfd85835904d023

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
2f97f18c15e915853e4df879be6e1f63

View File

@ -0,0 +1,260 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
0: []
1: []
2: []
3: []
4: []
5: []
6: []
7: []
8: []
9: []
10: []
11: []
12: []
13: []
14: []
15: []
16: []
17: []
18: []
19: []
20: []
21: []
22: []
23: []
24: []
25: []
26: []
27: []
28: []
29: []
30: []
31: []
32: []
33: []
34: []
35: []
36: []
37: []
38: []
39: []
40: []
41: []
42: []
43: []
44: []
45: []
46: []
47: []
48: []
49: []
50: []
51: []
52: []
53: []
54: []
55: []
56: []
57: []
58: []
59: []
60: []
61: []
62: []
63: []
64: []
65: []
66: []
67: []
68: []
69: []
70: []
71: []
72: []
73: []
74: []
75: []
76: []
77: []
78: []
79: []
80: []
81: []
82: []
83: []
84: []
85: []
86: []
87: []
88: []
89: []
90: []
91: []
92: []
93: []
94: []
95: []
96: []
97: []
98: []
99: []
100: []
101: []
102: []
103: []
104: []
105: []
106: []
107: []
108: []
109: []
110: []
111: []
112: []
113: []
114: []
115: []
116: []
117: []
118: []
119: []
120: []
121: []
122: []
123: []
124: []
125: []
126: []
127: []
128: []
129: []
130: []
131: []
132: []
133: []
134: []
135: []
136: []
137: []
138: []
139: []
140: []
141: []
142: []
143: []
144: []
145: []
146: []
147: []
148: []
149: []
150: []
151: []
152: []
153: []
154: []
155: []
156: []
157: []
158: []
159: []
160: []
161: []
162: []
163: []
164: []
165: []
166: []
167: []
168: []
169: []
170: []
171: []
172: []
173: []
174: []
175: []
176: []
177: []
178: []
179: []
180: []
181: []
182: []
183: []
184: []
185: []
186: []
187: []
188: []
189: []
190: []
191: []
192: []
193: []
194: []
195: []
196: []
197: []
198: []
199: []
200: []
201: []
202: []
203: []
204: []
205: []
206: []
207: []
208: []
209: []
210: []
211: []
212: []
213: []
214: []
215: []
216: []
217: []
218: []
219: []
220: []
221: []
222: []
223: []
224: []
225: []
226: []
227: []
228: []
229: []
230: []
231: []
232: []
233: []
234: []
235: []
236: []
237: []
238: []
239: []
240: []
241: []
242: []
243: []
244: []
245: []
246: []
247: []
248: []
249: []
250: []
251: []
252: []
253: []
254: []
255: []

View File

@ -0,0 +1,260 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
0: []
1: []
2: []
3: []
4: []
5: []
6: []
7: []
8: []
9: []
10: []
11: []
12: []
13: []
14: []
15: []
16: []
17: []
18: []
19: []
20: []
21: []
22: []
23: []
24: []
25: []
26: []
27: []
28: []
29: []
30: []
31: []
32: []
33: []
34: []
35: []
36: []
37: []
38: []
39: []
40: []
41: []
42: []
43: []
44: []
45: []
46: []
47: []
48: []
49: []
50: []
51: []
52: []
53: []
54: []
55: []
56: []
57: []
58: []
59: []
60: []
61: []
62: []
63: []
64: []
65: []
66: []
67: []
68: []
69: []
70: []
71: []
72: []
73: []
74: []
75: []
76: []
77: []
78: []
79: []
80: []
81: []
82: []
83: []
84: []
85: []
86: []
87: []
88: []
89: []
90: []
91: []
92: []
93: []
94: []
95: []
96: []
97: []
98: []
99: []
100: []
101: []
102: []
103: []
104: []
105: []
106: []
107: []
108: []
109: []
110: []
111: []
112: []
113: []
114: []
115: []
116: []
117: []
118: []
119: []
120: []
121: []
122: []
123: []
124: []
125: []
126: []
127: []
128: []
129: []
130: []
131: []
132: []
133: []
134: []
135: []
136: []
137: []
138: []
139: []
140: []
141: []
142: []
143: []
144: []
145: []
146: []
147: []
148: []
149: []
150: []
151: []
152: []
153: []
154: []
155: []
156: []
157: []
158: []
159: []
160: []
161: []
162: []
163: []
164: []
165: []
166: []
167: []
168: []
169: []
170: []
171: []
172: []
173: []
174: []
175: []
176: []
177: []
178: []
179: []
180: []
181: []
182: []
183: []
184: []
185: []
186: []
187: []
188: []
189: []
190: []
191: []
192: []
193: []
194: []
195: []
196: []
197: []
198: []
199: []
200: []
201: []
202: []
203: []
204: []
205: []
206: []
207: []
208: []
209: []
210: []
211: []
212: []
213: []
214: []
215: []
216: []
217: []
218: []
219: []
220: []
221: []
222: []
223: []
224: []
225: []
226: []
227: []
228: []
229: []
230: []
231: []
232: []
233: []
234: []
235: []
236: []
237: []
238: []
239: []
240: []
241: []
242: []
243: []
244: []
245: []
246: []
247: []
248: []
249: []
250: []
251: []
252: []
253: []
254: []
255: []

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
9c25261cec7275cb5cfd85835904d023

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
2f97f18c15e915853e4df879be6e1f63

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
c1c7a0bb91d53d33724583b6d4a99f16
e849066b0e43d5c456f086c552372afc

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
12213d3f1047a0c3d08e4670a7d688e7
8cc5e82995b0443b660f419bb9ea2e85

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
c1c7a0bb91d53d33724583b6d4a99f16
e849066b0e43d5c456f086c552372afc

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
12213d3f1047a0c3d08e4670a7d688e7
8cc5e82995b0443b660f419bb9ea2e85

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
ca59f20e043a4d52c49e15b10adf96bb
73b48005dc57b04f0939bbf21a68dab6

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
cb69e0fe10fb299bafe77514204379cb
3c23d35627667dcee98468bfdecf09d3

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
ca59f20e043a4d52c49e15b10adf96bb
73b48005dc57b04f0939bbf21a68dab6

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
cb69e0fe10fb299bafe77514204379cb
3c23d35627667dcee98468bfdecf09d3

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
3456db9a1bb94c33c1e9f656184ee711
c3f8b0b858a4820a508b25b42328cedd

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
2127cd818b457e0611e0c8e1a871602a
38a42f5dc25e99d7a5312a63ce94ed30

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
3456db9a1bb94c33c1e9f656184ee711
c3f8b0b858a4820a508b25b42328cedd

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
2127cd818b457e0611e0c8e1a871602a
38a42f5dc25e99d7a5312a63ce94ed30

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
b976551ceff412bfb2ec9bfbda320bbb
2049930204498b323885c91de88e44ca

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
7620ca1a96882c7147d3fd996570f9b3
7f0ca8c0fc6494f3dba46e8eb9699045

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
b976551ceff412bfb2ec9bfbda320bbb
2049930204498b323885c91de88e44ca

View File

@ -1,4 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
7620ca1a96882c7147d3fd996570f9b3
7f0ca8c0fc6494f3dba46e8eb9699045

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
ad8fc873747aaf1d3590e7ccab735985

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
7c6cc88697da835d33877b2df41fa1cb

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
ad8fc873747aaf1d3590e7ccab735985

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
7c6cc88697da835d33877b2df41fa1cb

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
9a8c7343b4735d37704748cabcd51ff2

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
898a7dc25a1441bc3e7e2a8a62d99090

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
9a8c7343b4735d37704748cabcd51ff2

View File

@ -0,0 +1,4 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
898a7dc25a1441bc3e7e2a8a62d99090

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, ]

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 0: [3, 5, 6, 9, 10, 11, 14, 18, 19, 24, 26, 28, 29, 32, 33, 35, 36, 37, 38, 39, 41, 46, 47, 49, 52, 53, 55, 59, 61, 64, 68, 71, 74, 75, 76, 81, 83, 85, 86, 88, 90, 91, 92, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 114, 115, 118, 119, 123, 124, 126, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 160, 161, 162, 163, 164, 167, 168, 169, 171, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 215, 216, 219, 220, 223, 224, 226, 230, 231, 233, 235, 236, 237, 238, 239, 241, 243, 244, 247, 250, 256, 258, 260, 262, 263, 264, 267, 269, 273, 277, 278, 279, 281, 282, 286, 289, 292, 293, 295, 297, 305, 306, 307, 308, 309, 310, 316, 319, 320, 323, 326, 335, 336, 338, 343, ]

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, ]

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 0: [3, 5, 6, 9, 10, 11, 14, 18, 19, 24, 26, 28, 29, 32, 33, 35, 36, 37, 38, 39, 41, 46, 47, 49, 52, 53, 55, 59, 61, 64, 68, 71, 74, 75, 76, 81, 83, 85, 86, 88, 90, 91, 92, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 114, 115, 118, 119, 123, 124, 126, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 160, 161, 162, 163, 164, 167, 168, 169, 171, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 215, 216, 219, 220, 223, 224, 226, 230, 231, 233, 235, 236, 237, 238, 239, 241, 243, 244, 247, 250, 256, 258, 260, 262, 263, 264, 267, 269, 273, 277, 278, 279, 281, 282, 286, 289, 292, 293, 295, 297, 305, 306, 307, 308, 309, 310, 316, 319, 320, 323, 326, 335, 336, 338, 343, ]

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 1: []

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 1: []

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, ]

View File

@ -0,0 +1,5 @@
---
source: milli/src/search/facet/facet_range_search.rs
---
all field_id 1: [3, 5, 6, 9, 10, 11, 14, 18, 19, 24, 26, 28, 29, 32, 33, 35, 36, 37, 38, 39, 41, 46, 47, 49, 52, 53, 55, 59, 61, 64, 68, 71, 74, 75, 76, 81, 83, 85, 86, 88, 90, 91, 92, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 114, 115, 118, 119, 123, 124, 126, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 160, 161, 162, 163, 164, 167, 168, 169, 171, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 215, 216, 219, 220, 223, 224, 226, 230, 231, 233, 235, 236, 237, 238, 239, 241, 243, 244, 247, 250, 256, 258, 260, 262, 263, 264, 267, 269, 273, 277, 278, 279, 281, 282, 286, 289, 292, 293, 295, 297, 305, 306, 307, 308, 309, 310, 316, 319, 320, 323, 326, 335, 336, 338, 343, ]

View File

@ -1,4 +0,0 @@
---
source: milli/src/update/index_documents/mod.rs
---
[0, 1, 4, ]