Merge pull request #1777 from quickwit-oss/guilload/ff-range-query-on-not-indexed-fields

Allow range queries via fast fields on non-indexed fields
This commit is contained in:
Adrien Guillo
2023-01-11 10:14:32 -05:00
committed by GitHub
3 changed files with 14 additions and 4 deletions

View File

@@ -13,6 +13,7 @@ use crate::core::Index;
use crate::indexer::{
convert_to_fast_value_and_get_term, set_string_and_get_terms, JsonTermWriter,
};
use crate::query::range_query::is_type_valid_for_fastfield_range_query;
use crate::query::{
AllQuery, BooleanQuery, BoostQuery, EmptyQuery, FuzzyTermQuery, Occur, PhraseQuery, Query,
RangeQuery, TermQuery, TermSetQuery,
@@ -335,9 +336,10 @@ impl QueryParser {
) -> Result<Term, QueryParserError> {
let field_entry = self.schema.get_field_entry(field);
let field_type = field_entry.field_type();
let field_supports_ff_range_queries = field_type.is_fast()
&& is_type_valid_for_fastfield_range_query(field_type.value_type());
let is_ip_and_fast = field_type.is_ip_addr() && field_type.is_fast();
if !field_type.is_indexed() && !is_ip_and_fast {
if !field_type.is_indexed() && !field_supports_ff_range_queries {
return Err(QueryParserError::FieldNotIndexed(
field_entry.name().to_string(),
));
@@ -855,7 +857,7 @@ mod test {
use super::{QueryParser, QueryParserError};
use crate::query::Query;
use crate::schema::{
FacetOptions, Field, IndexRecordOption, Schema, Term, TextFieldIndexing, TextOptions,
FacetOptions, Field, IndexRecordOption, Schema, Term, TextFieldIndexing, TextOptions, FAST,
INDEXED, STORED, STRING, TEXT,
};
use crate::tokenizer::{
@@ -889,6 +891,7 @@ mod test {
schema_builder.add_json_field("json_not_indexed", STORED);
schema_builder.add_bool_field("bool", INDEXED);
schema_builder.add_bool_field("notindexed_bool", STORED);
schema_builder.add_u64_field("u64_ff", FAST);
schema_builder.build()
}
@@ -1344,6 +1347,11 @@ mod test {
r#"(Excluded(Term(type=F64, field=10, -1.5)) TO Excluded(Term(type=F64, field=10, 1.5)))"#,
false,
);
test_parse_query_to_logical_ast_helper(
"u64_ff:[7 TO 77]",
r#"(Included(Term(type=U64, field=18, 7)) TO Included(Term(type=U64, field=18, 77)))"#,
false,
);
}
#[test]

View File

@@ -3,4 +3,6 @@ mod range_query;
mod range_query_ip_fastfield;
mod range_query_u64_fastfield;
pub(crate) use range_query::is_type_valid_for_fastfield_range_query;
pub use self::range_query::RangeQuery;

View File

@@ -287,7 +287,7 @@ impl RangeQuery {
}
}
fn is_type_valid_for_fastfield_range_query(typ: Type) -> bool {
pub(crate) fn is_type_valid_for_fastfield_range_query(typ: Type) -> bool {
match typ {
Type::U64 | Type::I64 | Type::F64 | Type::Bool | Type::Date => true,
Type::IpAddr => true,