mirror of
https://github.com/typesense/typesense.git
synced 2025-05-17 12:12:35 +08:00
Allow facet field to be used as a query/filter field.
This commit is contained in:
parent
dfbe3888d8
commit
2fc58a54bb
@ -344,11 +344,6 @@ Option<nlohmann::json> Collection::search(const std::string & query, const std::
|
||||
std::string error = "Field `" + field_name + "` should be a string or a string array.";
|
||||
return Option<nlohmann::json>(400, error);
|
||||
}
|
||||
|
||||
if(search_field.facet) {
|
||||
std::string error = "Field `" + field_name + "` is a faceted field - it cannot be used as a query field.";
|
||||
return Option<nlohmann::json>(400, error);
|
||||
}
|
||||
}
|
||||
|
||||
// validate filter fields
|
||||
|
@ -964,21 +964,64 @@ TEST_F(CollectionTest, FilterAndQueryFieldRestrictions) {
|
||||
|
||||
std::vector<std::string> facets;
|
||||
|
||||
// query should be allowed only on non-faceted text fields
|
||||
// query shall be allowed on faceted text fields as well
|
||||
query_fields = {"cast"};
|
||||
Option<nlohmann::json> result_op =
|
||||
coll_mul_fields->search("anton", query_fields, "", facets, sort_fields, 0, 10, 1, FREQUENCY, false);
|
||||
ASSERT_FALSE(result_op.ok());
|
||||
ASSERT_EQ(400, result_op.code());
|
||||
ASSERT_EQ("Field `cast` is a faceted field - it cannot be used as a query field.", result_op.error());
|
||||
ASSERT_TRUE(result_op.ok());
|
||||
|
||||
nlohmann::json results = result_op.get();
|
||||
ASSERT_EQ(1, results["hits"].size());
|
||||
std::string solo_id = results["hits"].at(0)["document"]["id"];
|
||||
ASSERT_STREQ("14", solo_id.c_str());
|
||||
|
||||
// filtering on string field should be possible
|
||||
query_fields = {"title"};
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "starring: Samuel L. Jackson", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(true, result_op.ok());
|
||||
nlohmann::json results = result_op.get();
|
||||
results = result_op.get();
|
||||
ASSERT_EQ(1, results["hits"].size());
|
||||
solo_id = results["hits"].at(0)["document"]["id"];
|
||||
ASSERT_STREQ("6", solo_id.c_str());
|
||||
|
||||
// filtering on facet field should be possible (supports partial word search but without typo tolerance)
|
||||
query_fields = {"title"};
|
||||
result_op = coll_mul_fields->search("*", query_fields, "cast: chris", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(true, result_op.ok());
|
||||
results = result_op.get();
|
||||
ASSERT_EQ(3, results["hits"].size());
|
||||
|
||||
// bad query string
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "BLAH", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(false, result_op.ok());
|
||||
ASSERT_STREQ("Could not parse the filter query.", result_op.error().c_str());
|
||||
|
||||
// missing field
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "age: 100", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(false, result_op.ok());
|
||||
ASSERT_STREQ("Could not find a filter field named `age` in the schema.", result_op.error().c_str());
|
||||
|
||||
// bad filter value type
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "points: \"100\"", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(false, result_op.ok());
|
||||
ASSERT_STREQ("Error with field `points`: Numerical field has an invalid comparator.", result_op.error().c_str());
|
||||
|
||||
// bad filter value type - equaling float on an integer field
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "points: 100.34", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(false, result_op.ok());
|
||||
ASSERT_STREQ("Error with field `points`: Numerical field has an invalid comparator.", result_op.error().c_str());
|
||||
|
||||
// bad filter value type - less than float on an integer field
|
||||
result_op = coll_mul_fields->search("captain", query_fields, "points: <100.0", facets, sort_fields, 0, 10, 1,
|
||||
FREQUENCY, false);
|
||||
ASSERT_EQ(false, result_op.ok());
|
||||
ASSERT_STREQ("Error with field `points`: Not an integer.", result_op.error().c_str());
|
||||
|
||||
collectionManager.drop_collection("coll_mul_fields");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user