diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-04-07 12:10:43 +0000 |
---|---|---|
committer | Geir Storli <geirst@yahooinc.com> | 2022-04-07 12:10:43 +0000 |
commit | be22b2c9def56339be83f9dbe3bbf32c53a7a5d4 (patch) | |
tree | c3e39bc3b9872ddd075f30165ebc626c4f74b561 /searchlib | |
parent | 87b9dcc76a9b33f8b456d53c9aa9e19e89645ee1 (diff) |
Implement createFilterSearch() for DirectAttributeBlueprint.
This ensures that query terms searching a weighted set attribute with fast-search
are included in the global filter used in nearest neighbor search in a hnsw index.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp | 34 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp | 7 |
2 files changed, 41 insertions, 0 deletions
diff --git a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp index 605a59b8a6a..192e137ddff 100644 --- a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp +++ b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp @@ -152,6 +152,16 @@ struct StringAttributeFiller { } }; +struct WsetStringAttributeFiller { + using ValueType = vespalib::string; + static void add(AttributeVector& attr, const vespalib::string& value) { + auto& real = downcast<StringAttribute>(attr); + uint32_t docid = attr.getNumDocs() - 1; + real.append(docid, value, 1); + real.commit(); + } +}; + struct IntegerAttributeFiller { using ValueType = int64_t; static void add(AttributeVector& attr, int64_t value) { @@ -183,6 +193,17 @@ make_string_attribute(const std::string& value) } AttributeVector::SP +make_wset_string_attribute(const std::string& value) +{ + Config cfg(BasicType::STRING, CollectionType::WSET); + // fast-search is needed to trigger use of DirectAttributeBlueprint. + cfg.setFastSearch(true); + auto attr = AttributeFactory::createAttribute(field, cfg); + fill<WsetStringAttributeFiller>(*attr, value); + return attr; +} + +AttributeVector::SP make_int_attribute(int64_t value) { Config cfg(BasicType::INT32, CollectionType::SINGLE); @@ -413,4 +434,17 @@ TEST(AttributeBlueprintTest, attribute_field_blueprint_wraps_filter_search_itera EXPECT_TRUE(wrapper.seek(2)); } +TEST(AttributeBlueprintTest, direct_attribute_blueprint_wraps_filter_search_iterator) +{ + BlueprintFactoryFixture f(make_wset_string_attribute("foo")); + SimpleStringTerm term("foo", field, 0, Weight(0)); + auto blueprint = f.create_blueprint(term); + + auto itr = blueprint->createFilterSearch(true, Blueprint::FilterConstraint::UPPER_BOUND); + auto& wrapper = downcast<FilterWrapper>(*itr); + wrapper.initRange(1, 3); + EXPECT_FALSE(wrapper.seek(1)); + EXPECT_TRUE(wrapper.seek(2)); +} + GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp index f14966dbfc8..bde73faf466 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp @@ -562,6 +562,13 @@ public: return std::make_unique<queryeval::DocumentWeightSearchIterator>(*tfmda[0], _attr, _dict_entry); } + SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override { + (void) constraint; // We provide an iterator with exact results, so no need to take constraint into consideration. + auto wrapper = std::make_unique<FilterWrapper>(getState().numFields()); + wrapper->wrap(createLeafSearch(wrapper->tfmda(), strict)); + return wrapper; + } + void visitMembers(vespalib::ObjectVisitor &visitor) const override { LeafBlueprint::visitMembers(visitor); visit(visitor, "attribute", _attrName); |