diff options
author | Tor Egge <Tor.Egge@online.no> | 2023-12-07 14:36:53 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2023-12-07 14:36:53 +0100 |
commit | 6fdfffbd6c8e205c67906cc5f7a5df9002be4a27 (patch) | |
tree | 69e9b2cee095783c86c7766674529b37057f4576 /streamingvisitors/src | |
parent | 10a580357998b4c750729f27d3ef2e224dd69af7 (diff) |
Add MultiTerm and InTerm for streaming search.
Diffstat (limited to 'streamingvisitors/src')
-rw-r--r-- | streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp | 6 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp | 15 |
2 files changed, 19 insertions, 2 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp index 8805cc5b3ec..6b15b7cb88e 100644 --- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp @@ -4,6 +4,7 @@ #include "rankprocessor.h" #include <vespa/searchlib/fef/handle.h> #include <vespa/searchlib/fef/simpletermfielddata.h> +#include <vespa/searchlib/query/streaming/multi_term.h> #include <vespa/searchlib/query/streaming/nearest_neighbor_query_node.h> #include <vespa/vsm/vsm/fieldsearchspec.h> #include <algorithm> @@ -26,6 +27,7 @@ using search::fef::TermFieldMatchData; using search::fef::TermFieldMatchDataPosition; using search::streaming::Hit; using search::streaming::HitList; +using search::streaming::MultiTerm; using search::streaming::Query; using search::streaming::QueryTerm; using search::streaming::QueryTermList; @@ -273,6 +275,10 @@ RankProcessor::unpack_match_data(uint32_t docid, MatchData &matchData, QueryWrap tmd->setRawScore(docid, raw_score.value()); } } + } else if (auto multi_term = term.getTerm()->as_multi_term()) { + auto& qtd = static_cast<QueryTermData &>(term.getTerm()->getQueryItem()); + auto& td = qtd.getTermData(); + multi_term->unpack_match_data(docid, td, matchData); } else if (!term.isPhraseTerm() || term.isFirstPhraseTerm()) { // consider 1 term data per phrase bool isPhrase = term.isFirstPhraseTerm(); QueryTermData & qtd = static_cast<QueryTermData &>(term.getTerm()->getQueryItem()); diff --git a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp index c11f9e839cf..c797e6751ee 100644 --- a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp +++ b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp @@ -3,6 +3,8 @@ #include <vespa/vsm/vsm/fieldsearchspec.h> #include <vespa/document/fieldvalue/arrayfieldvalue.h> #include <vespa/document/fieldvalue/weightedsetfieldvalue.h> +#include <vespa/searchlib/query/streaming/multi_term.h> +#include <vespa/vespalib/stllike/hash_set.h> #include <vespa/log/log.h> LOG_SETUP(".vsm.searcher.fieldsearcher"); @@ -230,6 +232,7 @@ void FieldIdTSearcherMap::prepare(const DocumentTypeIndexFieldMapT& difm, vespalib::string tmp; for (auto& searcher : *this) { QueryTermList onlyInIndex; + vespalib::hash_set<const void*> seen; FieldIdT fid = searcher->field(); for (auto qt : qtl) { for (const auto& doc_type_elem : difm) { @@ -237,8 +240,16 @@ void FieldIdTSearcherMap::prepare(const DocumentTypeIndexFieldMapT& difm, auto found = fim.find(FieldSearchSpecMap::stripNonFields(qt->index())); if (found != fim.end()) { const FieldIdTList & index = found->second; - if ((find(index.begin(), index.end(), fid) != index.end()) && (find(onlyInIndex.begin(), onlyInIndex.end(), qt) == onlyInIndex.end())) { - onlyInIndex.push_back(qt); + 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()); + } + } else { + onlyInIndex.emplace_back(qt); + } } } else { LOG(debug, "Could not find the requested index=%s in the index config map. Query does not fit search definition.", |