aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-12-07 14:36:53 +0100
committerTor Egge <Tor.Egge@online.no>2023-12-07 14:36:53 +0100
commit6fdfffbd6c8e205c67906cc5f7a5df9002be4a27 (patch)
tree69e9b2cee095783c86c7766674529b37057f4576 /streamingvisitors
parent10a580357998b4c750729f27d3ef2e224dd69af7 (diff)
Add MultiTerm and InTerm for streaming search.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp6
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp15
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.",