From b700eeb73d8de490cdafbc3d004ed091e71e3c9e Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 18 Mar 2024 17:24:35 +0100 Subject: Use multi_index_terms() returning boolean to differentiate between multi term nodes that all searches the same index (e.g. Phrase) and multi term nodes that searches multiple indexes (e.g. Equiv, SameElement). --- .../searchlib/query/streaming/equiv_query_node.cpp | 6 +++--- .../vespa/searchlib/query/streaming/equiv_query_node.h | 2 +- .../src/vespa/searchlib/query/streaming/multi_term.cpp | 18 ++++++++++++++++++ .../src/vespa/searchlib/query/streaming/multi_term.h | 7 ++++++- .../src/vespa/searchlib/query/streaming/queryterm.cpp | 12 ++++++------ .../src/vespa/searchlib/query/streaming/queryterm.h | 2 +- .../query/streaming/same_element_query_node.cpp | 6 +++--- .../query/streaming/same_element_query_node.h | 2 +- .../src/vespa/vsm/searcher/fieldsearcher.cpp | 7 +++---- .../src/vespa/vsm/vsm/fieldsearchspec.cpp | 6 +++--- 10 files changed, 45 insertions(+), 23 deletions(-) diff --git a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp index 4367dc1cd69..8878c8c5cdc 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp @@ -81,10 +81,10 @@ EquivQueryNode::unpack_match_data(uint32_t docid, const fef::ITermData& td, fef: unpack_match_data_helper(docid, td, match_data, hit_list, *this, is_filter(), index_env); } -const MultiTerm* -EquivQueryNode::as_multi_index_multi_term() const noexcept +bool +EquivQueryNode::multi_index_terms() const noexcept { - return this; + return true; } const EquivQueryNode* diff --git a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h index ac87e14150b..997a861ee44 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h @@ -17,7 +17,7 @@ public: bool evaluate() const override; const HitList & evaluateHits(HitList & hl) const override; void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env) override; - const MultiTerm* as_multi_index_multi_term() const noexcept override; + bool multi_index_terms() const noexcept override; const EquivQueryNode* as_equiv_query_node() const noexcept override; std::vector> steal_terms(); }; diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp index f5a09892551..2a96a967215 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp @@ -51,4 +51,22 @@ MultiTerm::evaluate() const return false; } +MultiTerm* +MultiTerm::as_multi_term() noexcept +{ + return this; +} + +const MultiTerm* +MultiTerm::as_multi_term() const noexcept +{ + return this; +} + +bool +MultiTerm::multi_index_terms() const noexcept +{ + return false; +} + } diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h index 9bf5f8de6b2..a2ae3d30d52 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h +++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h @@ -29,7 +29,12 @@ public: std::unique_ptr terms, Normalizing normalizing); ~MultiTerm() override; void add_term(std::unique_ptr term); - MultiTerm* as_multi_term() noexcept override { return this; } + MultiTerm* as_multi_term() noexcept override; + const MultiTerm* as_multi_term() const noexcept override; + /* + * Terms below search in different indexes when multi_index_terms() returns true. + */ + virtual bool multi_index_terms() const noexcept; void reset() override; bool evaluate() const override; const std::vector>& get_terms() const noexcept { return _terms; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp index 8a1fe2004d0..07fc60d2243 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp @@ -135,20 +135,20 @@ QueryTerm::as_multi_term() noexcept return nullptr; } -RegexpTerm* -QueryTerm::as_regexp_term() noexcept +const MultiTerm* +QueryTerm::as_multi_term() const noexcept { return nullptr; } -FuzzyTerm* -QueryTerm::as_fuzzy_term() noexcept +RegexpTerm* +QueryTerm::as_regexp_term() noexcept { return nullptr; } -const MultiTerm* -QueryTerm::as_multi_index_multi_term() const noexcept +FuzzyTerm* +QueryTerm::as_fuzzy_term() noexcept { return nullptr; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h index 4a108d880e9..78b0a1fea7d 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h @@ -104,9 +104,9 @@ public: void setFuzzyPrefixLength(uint32_t fuzzyPrefixLength) { _fuzzyPrefixLength = fuzzyPrefixLength; } virtual NearestNeighborQueryNode* as_nearest_neighbor_query_node() noexcept; virtual MultiTerm* as_multi_term() noexcept; + virtual const MultiTerm* as_multi_term() const noexcept; virtual RegexpTerm* as_regexp_term() noexcept; virtual FuzzyTerm* as_fuzzy_term() noexcept; - virtual const MultiTerm* as_multi_index_multi_term() const noexcept; virtual const EquivQueryNode* as_equiv_query_node() const noexcept; virtual void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env); protected: diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp index ae1ae8d5230..cd9c693ca1c 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp @@ -89,10 +89,10 @@ SameElementQueryNode::unpack_match_data(uint32_t docid, const fef::ITermData& td } } -const MultiTerm* -SameElementQueryNode::as_multi_index_multi_term() const noexcept +bool +SameElementQueryNode::multi_index_terms() const noexcept { - return this; + return true; } } diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h index 8955071ba4a..37fb3dbba52 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h @@ -17,7 +17,7 @@ public: bool evaluate() const override; const HitList & evaluateHits(HitList & hl) const override; void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env) override; - const MultiTerm* as_multi_index_multi_term() const noexcept override; + bool multi_index_terms() const noexcept override; }; } diff --git a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp index b03ae07c910..38e12a3054d 100644 --- a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp +++ b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp @@ -192,9 +192,9 @@ FieldSearcher::init() void FieldIdTSearcherMap::prepare_term(const DocumentTypeIndexFieldMapT& difm, QueryTerm* qt, FieldIdT fid, vespalib::hash_set& seen, QueryTermList& onlyInIndex) { - auto mimt = qt->as_multi_index_multi_term(); - if (mimt != nullptr) { - for (auto& subterm : mimt->get_terms()) { + auto multi_term = qt->as_multi_term(); + if (multi_term != nullptr && multi_term->multi_index_terms()) { + for (auto& subterm : multi_term->get_terms()) { prepare_term(difm, subterm.get(), fid, seen, onlyInIndex); } return; @@ -206,7 +206,6 @@ FieldIdTSearcherMap::prepare_term(const DocumentTypeIndexFieldMapT& difm, QueryT const FieldIdTList & index = found->second; if ((find(index.begin(), index.end(), fid) != index.end()) && !seen.contains(qt)) { seen.insert(qt); - auto multi_term = qt->as_multi_term(); if (multi_term != nullptr) { for (auto& subterm : multi_term->get_terms()) { onlyInIndex.emplace_back(subterm.get()); diff --git a/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp b/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp index 35ce1a07cfb..1dbac859262 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp @@ -223,9 +223,9 @@ FieldSearchSpecMap::buildFieldsInQuery(const Query & query) const query.getLeaves(qtl); for (const auto & term : qtl) { - auto mimt = term->as_multi_index_multi_term(); - if (mimt != nullptr) { - for (const auto& subterm : mimt->get_terms()) { + auto multi_term = term->as_multi_term(); + if (multi_term != nullptr && multi_term->multi_index_terms()) { + for (const auto& subterm : multi_term->get_terms()) { addFieldsFromIndex(subterm->index(), fieldsInQuery); } } else { -- cgit v1.2.3