mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2026-01-05 16:52:55 +00:00
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:
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user