From 72a561ae8d19d91f911aa475fb6d34a143373fdd Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 25 Sep 2023 20:56:22 +0000 Subject: - Make iterator pack template argument to handle both AttributeIteratorPack and SearchIteratorPack. - Use DocumentWeightOrFilterSearch to implement weightset search when filter and no rank needed. --- .../attribute/document_weight_or_filter_search.cpp | 43 +++++++++++++++------- .../attribute/document_weight_or_filter_search.h | 10 ++--- .../vespa/searchlib/attribute/iterator_pack.cpp | 8 ++++ .../src/vespa/searchlib/attribute/iterator_pack.h | 8 ++-- .../vespa/searchlib/queryeval/iterator_pack.cpp | 2 +- .../src/vespa/searchlib/queryeval/iterator_pack.h | 12 +++--- .../queryeval/weighted_set_term_blueprint.cpp | 1 - .../queryeval/weighted_set_term_search.cpp | 5 +++ 8 files changed, 58 insertions(+), 31 deletions(-) (limited to 'searchlib/src') diff --git a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp index c840c5cbc91..97e725649d3 100644 --- a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp +++ b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp @@ -2,22 +2,27 @@ #include "document_weight_or_filter_search.h" #include "iterator_pack.h" +#include +#include #include #include +using search::queryeval::SearchIteratorPack; + namespace search::attribute { +template class DocumentWeightOrFilterSearchImpl : public DocumentWeightOrFilterSearch { - AttributeIteratorPack _children; + IteratorPack _children; void seek_all(uint32_t docId); public: - explicit DocumentWeightOrFilterSearchImpl(AttributeIteratorPack&& children); + explicit DocumentWeightOrFilterSearchImpl(IteratorPack&& children); ~DocumentWeightOrFilterSearchImpl() override; void doSeek(uint32_t docId) override; - void doUnpack(uint32_t) override; + void doUnpack(uint32_t) override { } void initRange(uint32_t begin, uint32_t end) override { SearchIterator::initRange(begin, end); @@ -40,16 +45,19 @@ public: Trinary is_strict() const override { return Trinary::True; } }; -DocumentWeightOrFilterSearchImpl::DocumentWeightOrFilterSearchImpl(AttributeIteratorPack&& children) +template +DocumentWeightOrFilterSearchImpl::DocumentWeightOrFilterSearchImpl(IteratorPack&& children) : DocumentWeightOrFilterSearch(), _children(std::move(children)) { } -DocumentWeightOrFilterSearchImpl::~DocumentWeightOrFilterSearchImpl() = default; +template +DocumentWeightOrFilterSearchImpl::~DocumentWeightOrFilterSearchImpl() = default; +template void -DocumentWeightOrFilterSearchImpl::seek_all(uint32_t docId) { +DocumentWeightOrFilterSearchImpl::seek_all(uint32_t docId) { for (uint16_t i = 0; i < _children.size(); ++i) { uint32_t next = _children.get_docid(i); if (next < docId) { @@ -58,8 +66,9 @@ DocumentWeightOrFilterSearchImpl::seek_all(uint32_t docId) { } } +template void -DocumentWeightOrFilterSearchImpl::doSeek(uint32_t docId) +DocumentWeightOrFilterSearchImpl::doSeek(uint32_t docId) { uint32_t min_doc_id = endDocId; for (uint16_t i = 0; i < _children.size(); ++i) { @@ -76,11 +85,6 @@ DocumentWeightOrFilterSearchImpl::doSeek(uint32_t docId) setDocId(min_doc_id); } -void -DocumentWeightOrFilterSearchImpl::doUnpack(uint32_t) -{ -} - std::unique_ptr DocumentWeightOrFilterSearch::create(std::vector&& children) { @@ -89,7 +93,20 @@ DocumentWeightOrFilterSearch::create(std::vector&& child } else { std::sort(children.begin(), children.end(), [](const auto & a, const auto & b) { return a.size() > b.size(); }); - return std::make_unique(AttributeIteratorPack(std::move(children))); + using OrFilter = DocumentWeightOrFilterSearchImpl; + return std::make_unique(AttributeIteratorPack(std::move(children))); + } +} + +std::unique_ptr +DocumentWeightOrFilterSearch::create(const std::vector& children, + std::unique_ptr md) +{ + if (children.empty()) { + return std::make_unique(); + } else { + using OrFilter = DocumentWeightOrFilterSearchImpl; + return std::make_unique(SearchIteratorPack(children, std::move(md))); } } diff --git a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h index c601856573f..19fa20e2d51 100644 --- a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h +++ b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h @@ -3,6 +3,7 @@ #include "i_document_weight_attribute.h" #include +namespace search::fef { class MatchData; } namespace search::attribute { /** @@ -12,12 +13,11 @@ namespace search::attribute { class DocumentWeightOrFilterSearch : public queryeval::SearchIterator { protected: - DocumentWeightOrFilterSearch() - : queryeval::SearchIterator() - { - } + DocumentWeightOrFilterSearch() = default; public: - static std::unique_ptr create(std::vector&& children); + static std::unique_ptr create(std::vector&& children); + static std::unique_ptr create(const std::vector& children, + std::unique_ptr md); }; } diff --git a/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp b/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp index ab06fc270bd..3d9e3095536 100644 --- a/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp +++ b/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp @@ -5,6 +5,14 @@ namespace search { +AttributeIteratorPack::~AttributeIteratorPack() = default; + +AttributeIteratorPack::AttributeIteratorPack(std::vector &&children) + : _children(std::move(children)) +{ + assert(_children.size() < 0x10000); +} + std::unique_ptr AttributeIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) { BitVector::UP result(BitVector::create(begin_id, end_id)); diff --git a/searchlib/src/vespa/searchlib/attribute/iterator_pack.h b/searchlib/src/vespa/searchlib/attribute/iterator_pack.h index 1753a3d0c2d..80e4c227860 100644 --- a/searchlib/src/vespa/searchlib/attribute/iterator_pack.h +++ b/searchlib/src/vespa/searchlib/attribute/iterator_pack.h @@ -15,12 +15,12 @@ private: std::vector _children; public: - AttributeIteratorPack() : _children() {} + AttributeIteratorPack() noexcept : _children() {} AttributeIteratorPack(AttributeIteratorPack &&rhs) noexcept = default; AttributeIteratorPack &operator=(AttributeIteratorPack &&rhs) noexcept = default; - explicit AttributeIteratorPack(std::vector &&children) - : _children(std::move(children)) {} + explicit AttributeIteratorPack(std::vector &&children); + ~AttributeIteratorPack(); uint32_t get_docid(uint16_t ref) const { return _children[ref].valid() ? _children[ref].getKey() : endDocId; @@ -41,7 +41,7 @@ public: std::unique_ptr get_hits(uint32_t begin_id, uint32_t end_id); void or_hits_into(BitVector &result, uint32_t begin_id); - size_t size() const noexcept { return _children.size(); } + uint16_t size() const noexcept { return _children.size(); } void initRange(uint32_t begin, uint32_t end) { (void) end; for (auto &child: _children) { diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp index e9f1b526a87..5280100b5bc 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp @@ -28,6 +28,7 @@ SearchIteratorPack::SearchIteratorPack(const std::vector &child _children.emplace_back(child); } assert((_children.size() == _childMatch.size()) || _childMatch.empty()); + assert(_children.size() < 0x10000); } SearchIteratorPack::SearchIteratorPack(const std::vector &children, MatchDataUP md) @@ -36,7 +37,6 @@ SearchIteratorPack::SearchIteratorPack(const std::vector &child std::unique_ptr SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const { - BitVector::UP result = TermwiseHelper::orChildren(_children.begin(), _children.end(), begin_id); if (! result ) { result = BitVector::create(begin_id, end_id); diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h index 907371008d9..ca1e6461533 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h +++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h @@ -31,27 +31,25 @@ public: // TODO: use MultiSearch::Children to pass ownership SearchIteratorPack(const std::vector &children, MatchDataUP md); - uint32_t get_docid(uint32_t ref) const { + uint32_t get_docid(uint16_t ref) const { return _children[ref]->getDocId(); } - uint32_t seek(uint32_t ref, uint32_t docid) { + uint32_t seek(uint16_t ref, uint32_t docid) { _children[ref]->seek(docid); return _children[ref]->getDocId(); } - int32_t get_weight(uint32_t ref, uint32_t docid) { + int32_t get_weight(uint16_t ref, uint32_t docid) { _children[ref]->doUnpack(docid); return _childMatch[ref]->getWeight(); } - void unpack(uint32_t ref, uint32_t docid) { + void unpack(uint16_t ref, uint32_t docid) { _children[ref]->doUnpack(docid); } - size_t size() const { - return _children.size(); - } + uint16_t size() const { return _children.size(); } void initRange(uint32_t begin, uint32_t end) { for (auto & child: _children) { child->initRange(begin, end); diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp index 97f6bc2e6f8..55009e714b9 100644 --- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp @@ -92,7 +92,6 @@ WeightedSetTermBlueprint::addTerm(Blueprint::UP term, int32_t weight, HitEstimat _terms.push_back(std::move(term)); } - SearchIterator::UP WeightedSetTermBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool) const { diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp index 8478a0d3c35..27cfff1cf24 100644 --- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp @@ -2,6 +2,7 @@ #include "weighted_set_term_search.h" #include +#include #include #include @@ -171,6 +172,10 @@ WeightedSetTermSearch::create(const std::vector &children, using ArrayHeapImpl = WeightedSetTermSearchImpl; using HeapImpl = WeightedSetTermSearchImpl; + if (field_is_filter && tmd.isNotNeeded()) { + return attribute::DocumentWeightOrFilterSearch::create(children, std::move(match_data)); + } + if (children.size() < 128) { return SearchIterator::UP(new ArrayHeapImpl(tmd, field_is_filter, weights, SearchIteratorPack(children, std::move(match_data)))); } -- cgit v1.2.3