From 93535a1317573c59091a37f1c4abbbd01d18896d Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 22 Jan 2024 16:16:14 +0000 Subject: Resort to unranked rankprofile if hits=0 --- .../src/vespa/searchvisitor/rankprocessor.cpp | 5 ++--- .../src/vespa/searchvisitor/searchvisitor.cpp | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'streamingvisitors/src') diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp index 3fc7f351151..0a64ee7c093 100644 --- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp @@ -114,7 +114,7 @@ RankProcessor::initQueryEnvironment() void RankProcessor::initHitCollector(size_t wantedHitCount) { - _hitCollector.reset(new HitCollector(wantedHitCount)); + _hitCollector = std::make_unique(wantedHitCount); } void @@ -209,9 +209,8 @@ class RankProgramWrapper : public HitCollector::IRankProgram { private: MatchData &_match_data; - public: - RankProgramWrapper(MatchData &match_data) : _match_data(match_data) {} + explicit RankProgramWrapper(MatchData &match_data) : _match_data(match_data) {} void run(uint32_t docid, const std::vector &matchData) override { // Prepare the match data object used by the rank program with earlier unpacked match data. copyTermFieldMatchData(matchData, _match_data); diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp index cdd1a018d84..979e5f25b6a 100644 --- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp @@ -391,7 +391,17 @@ SearchVisitor::init(const Parameters & params) } _queryResult->getSearchResult().setWantedHitCount(wantedSummaryCount); + vespalib::stringref sortRef; + bool hasSortSpec = params.lookup("sort", sortRef); + vespalib::stringref groupingRef; + bool hasGrouping = params.lookup("aggregation", groupingRef); + if (params.lookup("rankprofile", valueRef) ) { + if ( ! hasGrouping && (wantedSummaryCount == 0)) { + // If no hits and no grouping, just use unranked profile + // TODO, optional could also include check for if grouping needs rank + valueRef = "unranked"; + } vespalib::string tmp(valueRef.data(), valueRef.size()); _rankController.setRankProfile(tmp); LOG(debug, "Received rank profile: %s", _rankController.getRankProfile().c_str()); @@ -442,9 +452,9 @@ SearchVisitor::init(const Parameters & params) if (_env) { _init_called = true; - if ( params.lookup("sort", valueRef) ) { + if ( hasSortSpec ) { search::uca::UcaConverterFactory ucaFactory; - _sortSpec = search::common::SortSpec(vespalib::string(valueRef.data(), valueRef.size()), ucaFactory); + _sortSpec = search::common::SortSpec(vespalib::string(sortRef.data(), sortRef.size()), ucaFactory); LOG(debug, "Received sort specification: '%s'", _sortSpec.getSpec().c_str()); } @@ -494,10 +504,10 @@ SearchVisitor::init(const Parameters & params) LOG(warning, "No query received"); } - if (params.lookup("aggregation", valueRef) ) { + if (hasGrouping) { std::vector newAggrBlob; - newAggrBlob.resize(valueRef.size()); - memcpy(&newAggrBlob[0], valueRef.data(), newAggrBlob.size()); + newAggrBlob.resize(groupingRef.size()); + memcpy(&newAggrBlob[0], groupingRef.data(), newAggrBlob.size()); LOG(debug, "Received new aggregation blob of %zd bytes", newAggrBlob.size()); setupGrouping(newAggrBlob); } -- cgit v1.2.3