diff options
author | Geir Storli <geirst@yahooinc.com> | 2023-12-19 12:48:19 +0000 |
---|---|---|
committer | Geir Storli <geirst@yahooinc.com> | 2023-12-19 12:48:19 +0000 |
commit | 29a322a5ed88935cf225b913ec652be0cdb056ef (patch) | |
tree | 89d33cb77e402b317970de780a7d016f853ee18e /searchlib/src | |
parent | 9a82744b7bab8ce525d85beef5bb2d774472e22c (diff) |
Support TermFieldMatchData where doUnpack() sets docid.
This will be needed for an InTerm used for ranking, e.g. the matches rank feature.
Diffstat (limited to 'searchlib/src')
3 files changed, 36 insertions, 10 deletions
diff --git a/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp index dea2702ef0d..552a128c518 100644 --- a/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp +++ b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp @@ -3,6 +3,7 @@ #include <vespa/searchlib/attribute/i_direct_posting_store.h> #include <vespa/searchlib/attribute/multi_term_or_filter_search.h> #include <vespa/searchlib/common/bitvector.h> +#include <vespa/searchlib/fef/termfieldmatchdata.h> #include <vespa/searchlib/queryeval/searchiterator.h> #include <vespa/vespalib/gtest/gtest.h> #define ENABLE_GTEST_MIGRATION @@ -11,13 +12,16 @@ using PostingList = search::attribute::PostingListTraits<int32_t>::PostingStoreBase; using Iterator = search::attribute::PostingListTraits<int32_t>::const_iterator; using KeyData = PostingList::KeyDataType; + using search::BitVector; using search::attribute::MultiTermOrFilterSearch; +using search::fef::TermFieldMatchData; using search::queryeval::SearchIterator; using vespalib::datastore::EntryRef; class MultiTermOrFilterSearchTest : public ::testing::Test { PostingList _postings; + mutable TermFieldMatchData _tfmd; vespalib::GenerationHandler _gens; std::vector<EntryRef> _trees; uint32_t _range_start; @@ -62,7 +66,7 @@ public: for (size_t i = 0; i < num_trees(); ++i) { iterators.emplace_back(get_tree(i)); } - auto result = MultiTermOrFilterSearch::create(std::move(iterators)); + auto result = MultiTermOrFilterSearch::create(std::move(iterators), _tfmd); result->initRange(_range_start, _range_end); return result; }; @@ -73,6 +77,8 @@ public: while (doc_id < _range_end) { if (iterator.seek(doc_id)) { result.emplace_back(doc_id); + iterator.unpack(doc_id); + EXPECT_EQ(doc_id, _tfmd.getDocId()); ++doc_id; } else { doc_id = std::max(doc_id + 1, iterator.getDocId()); diff --git a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp index 19668522e17..214851e9681 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp @@ -15,14 +15,19 @@ template<typename IteratorPack> class MultiTermOrFilterSearchImpl : public MultiTermOrFilterSearch { IteratorPack _children; + fef::TermFieldMatchData* _tfmd; void seek_all(uint32_t docId); public: - explicit MultiTermOrFilterSearchImpl(IteratorPack&& children); + explicit MultiTermOrFilterSearchImpl(IteratorPack&& children, fef::TermFieldMatchData* tfmd); ~MultiTermOrFilterSearchImpl() override; void doSeek(uint32_t docId) override; - void doUnpack(uint32_t) override { } + void doUnpack(uint32_t docid) override { + if (_tfmd != nullptr) { + _tfmd->resetOnlyDocId(docid); + } + } void initRange(uint32_t begin, uint32_t end) override { SearchIterator::initRange(begin, end); @@ -46,9 +51,10 @@ public: }; template<typename IteratorPack> -MultiTermOrFilterSearchImpl<IteratorPack>::MultiTermOrFilterSearchImpl(IteratorPack&& children) +MultiTermOrFilterSearchImpl<IteratorPack>::MultiTermOrFilterSearchImpl(IteratorPack&& children, fef::TermFieldMatchData* tfmd) : MultiTermOrFilterSearch(), - _children(std::move(children)) + _children(std::move(children)), + _tfmd(tfmd) { } @@ -89,7 +95,7 @@ namespace { template <typename IteratorType, typename IteratorPackType> std::unique_ptr<queryeval::SearchIterator> -create_helper(std::vector<IteratorType>&& children) +create_helper(std::vector<IteratorType>&& children, fef::TermFieldMatchData* tfmd) { if (children.empty()) { return std::make_unique<queryeval::EmptySearch>(); @@ -97,7 +103,7 @@ create_helper(std::vector<IteratorType>&& children) std::sort(children.begin(), children.end(), [](const auto & a, const auto & b) { return a.size() > b.size(); }); using OrFilter = MultiTermOrFilterSearchImpl<IteratorPackType>; - return std::make_unique<OrFilter>(IteratorPackType(std::move(children))); + return std::make_unique<OrFilter>(IteratorPackType(std::move(children)), tfmd); } } @@ -106,13 +112,25 @@ create_helper(std::vector<IteratorType>&& children) std::unique_ptr<queryeval::SearchIterator> MultiTermOrFilterSearch::create(std::vector<DocidIterator>&& children) { - return create_helper<DocidIterator, DocidIteratorPack>(std::move(children)); + return create_helper<DocidIterator, DocidIteratorPack>(std::move(children), nullptr); +} + +std::unique_ptr<queryeval::SearchIterator> +MultiTermOrFilterSearch::create(std::vector<DocidIterator>&& children, fef::TermFieldMatchData& tfmd) +{ + return create_helper<DocidIterator, DocidIteratorPack>(std::move(children), &tfmd); } std::unique_ptr<queryeval::SearchIterator> MultiTermOrFilterSearch::create(std::vector<DocidWithWeightIterator>&& children) { - return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children)); + return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children), nullptr); +} + +std::unique_ptr<queryeval::SearchIterator> +MultiTermOrFilterSearch::create(std::vector<DocidWithWeightIterator>&& children, fef::TermFieldMatchData& tfmd) +{ + return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children), &tfmd); } std::unique_ptr<queryeval::SearchIterator> @@ -123,7 +141,7 @@ MultiTermOrFilterSearch::create(const std::vector<SearchIterator *>& children, return std::make_unique<queryeval::EmptySearch>(); } else { using OrFilter = MultiTermOrFilterSearchImpl<SearchIteratorPack>; - return std::make_unique<OrFilter>(SearchIteratorPack(children, std::move(md))); + return std::make_unique<OrFilter>(SearchIteratorPack(children, std::move(md)), nullptr); } } diff --git a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h index 42eb33d2eed..1e8227c3007 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h +++ b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h @@ -18,7 +18,9 @@ protected: MultiTermOrFilterSearch() = default; public: static std::unique_ptr<SearchIterator> create(std::vector<DocidIterator>&& children); + static std::unique_ptr<SearchIterator> create(std::vector<DocidIterator>&& children, fef::TermFieldMatchData& tfmd); static std::unique_ptr<SearchIterator> create(std::vector<DocidWithWeightIterator>&& children); + static std::unique_ptr<SearchIterator> create(std::vector<DocidWithWeightIterator>&& children, fef::TermFieldMatchData& tfmd); static std::unique_ptr<SearchIterator> create(const std::vector<SearchIterator *>& children, std::unique_ptr<fef::MatchData> md); }; |