aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-01-22 16:16:14 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2024-01-22 16:16:14 +0000
commit93535a1317573c59091a37f1c4abbbd01d18896d (patch)
treedad3c8c5fd073741830cbf6be9bccb3e1dd5fbcc /streamingvisitors
parentfb0271e2a858053eec087902e1951c5fd8845bb0 (diff)
Resort to unranked rankprofile if hits=0
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp5
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp20
2 files changed, 17 insertions, 8 deletions
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<HitCollector>(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<search::fef::TermFieldMatchData> &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<char> 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);
}