diff options
Diffstat (limited to 'streamingvisitors/src/vespa')
-rw-r--r-- | streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp | 26 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/searchvisitor/rankprocessor.h | 3 |
2 files changed, 21 insertions, 8 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp index 24925bd67ee..b41eb041c57 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/nearest_neighbor_query_node.h> #include <vespa/vsm/vsm/fieldsearchspec.h> #include <cmath> #include <vespa/log/log.h> @@ -227,14 +228,27 @@ void RankProcessor::unpackMatchData(uint32_t docId) { _docId = docId; - unpackMatchData(*_match_data); + unpack_match_data(docId, *_match_data, _query); } void -RankProcessor::unpackMatchData(MatchData &matchData) +RankProcessor::unpack_match_data(uint32_t docid, MatchData &matchData, QueryWrapper& query) { - for (QueryWrapper::Term & term: _query.getTermList()) { - if (!term.isPhraseTerm() || term.isFirstPhraseTerm()) { // consider 1 term data per phrase + for (QueryWrapper::Term & term: query.getTermList()) { + auto nn_node = term.getTerm()->as_nearest_neighbor_query_node(); + if (nn_node != nullptr) { + auto& raw_score = nn_node->get_raw_score(); + if (raw_score.has_value()) { + auto& qtd = static_cast<QueryTermData &>(term.getTerm()->getQueryItem()); + auto& td = qtd.getTermData(); + if (td.numFields() == 1u) { + auto tfd = td.field(0u); + auto tmd = matchData.resolveTermField(tfd.getHandle()); + assert(tmd != nullptr); + tmd->setRawScore(docid, raw_score.value()); + } + } + } else if (!term.isPhraseTerm() || term.isFirstPhraseTerm()) { // consider 1 term data per phrase bool isPhrase = term.isFirstPhraseTerm(); QueryTermData & qtd = static_cast<QueryTermData &>(term.getTerm()->getQueryItem()); const ITermData &td = qtd.getTermData(); @@ -266,8 +280,8 @@ RankProcessor::unpackMatchData(MatchData &matchData) tmd = matchData.resolveTermField(tfd->getHandle()); tmd->setFieldId(fieldId); // reset field match data, but only once per docId - if (tmd->getDocId() != _docId) { - tmd->reset(_docId); + if (tmd->getDocId() != docid) { + tmd->reset(docid); } } // find fieldLen for new field diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h index c2b3d8adedf..039a9386539 100644 --- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h +++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h @@ -50,8 +50,6 @@ private: **/ void init(bool forRanking, size_t wantedHitCount); - void unpackMatchData(search::fef::MatchData &matchData); - public: using UP = std::unique_ptr<RankProcessor>; @@ -65,6 +63,7 @@ public: void initForRanking(size_t wantedHitCount); void initForDumping(size_t wantedHitCount); void unpackMatchData(uint32_t docId); + static void unpack_match_data(uint32_t docid, search::fef::MatchData& matchData, QueryWrapper& query); void runRankProgram(uint32_t docId); search::FeatureSet::SP calculateFeatureSet(); void fillSearchResult(vdslib::SearchResult & searchResult); |