aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-02-29 12:23:40 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2024-02-29 12:23:40 +0000
commite34cb01cc56158c97036f54c34467bd14470b4c4 (patch)
treea98a5d6f01d674150d17c4425b741549abdf7b98 /searchcore/src
parent2349e03ae70f25c404254c69e7d8bda361ea0f1c (diff)
Cache the query stack if using ranking.queryCache and use it for proper summary handling
Diffstat (limited to 'searchcore/src')
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/matcher.cpp28
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/matcher.h5
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/search_session.cpp3
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/search_session.h4
5 files changed, 33 insertions, 13 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
index d6cccf47b18..6c7232c5491 100644
--- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
@@ -7,7 +7,6 @@
#include <vespa/searchlib/common/location.h>
#include <vespa/searchlib/common/matching_elements.h>
#include <vespa/vespalib/data/slime/slime.h>
-#include <vespa/vespalib/util/size_literals.h>
#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/log/log.h>
@@ -50,6 +49,11 @@ DocsumContext::initState()
{
const DocsumRequest & req = _request;
_docsumState._args.initFromDocsumRequest(req);
+ auto [session, expectSession] = Matcher::lookupSearchSession(_sessionMgr, req);
+ if (session) {
+ vespalib::stringref queryStack = session->getStackDump();
+ _docsumState._args.setStackDump(queryStack.size(), queryStack.data());
+ }
_docsumState._docsumbuf.clear();
_docsumState._docsumbuf.reserve(req.hits.size());
for (const auto & hit : req.hits) {
diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
index c4a0593a865..4a9156770f0 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
@@ -269,6 +269,8 @@ Matcher::match(const SearchRequest &request, vespalib::ThreadBundle &threadBundl
// These should have been moved instead.
owned_objects.feature_overrides = std::make_unique<Properties>(*feature_overrides);
feature_overrides = owned_objects.feature_overrides.get();
+ vespalib::stringref queryStack = request.getStackRef();
+ owned_objects.stackDump.assign(queryStack.begin(), queryStack.end());
}
MatchToolsFactory::UP mtf = create_match_tools_factory(request, searchContext, attrContext, metaStore,
@@ -385,6 +387,18 @@ Matcher::get_matching_elements(const DocsumRequest &req, ISearchContext &search_
return docsum_matcher->get_matching_elements(fields);
}
+std::pair<std::shared_ptr<SearchSession>, bool>
+Matcher::lookupSearchSession(SessionManager &session_manager, const Request & req) {
+ SessionId sessionId(req.sessionId.data(), req.sessionId.size());
+ if (!sessionId.empty()) {
+ const Properties &cache_props = req.propertiesMap.cacheProperties();
+ if (cache_props.lookup("query").found()) {
+ return {session_manager.pickSearch(sessionId), true};
+ }
+ }
+ return {{}, false};
+}
+
DocsumMatcher::UP
Matcher::create_docsum_matcher(const DocsumRequest &req, ISearchContext &search_ctx,
IAttributeContext &attr_ctx, SessionManager &session_manager) const
@@ -397,17 +411,9 @@ Matcher::create_docsum_matcher(const DocsumRequest &req, ISearchContext &search_
}
}
std::sort(docs.begin(), docs.end());
- SessionId sessionId(req.sessionId.data(), req.sessionId.size());
- bool expectedSessionCached(false);
- if (!sessionId.empty()) {
- const Properties &cache_props = req.propertiesMap.cacheProperties();
- expectedSessionCached = cache_props.lookup("query").found();
- if (expectedSessionCached) {
- SearchSession::SP session(session_manager.pickSearch(sessionId));
- if (session) {
- return std::make_unique<DocsumMatcher>(std::move(session), std::move(docs));
- }
- }
+ auto [session, expectedSessionCached] = lookupSearchSession(session_manager, req);
+ if (session) {
+ return std::make_unique<DocsumMatcher>(std::move(session), std::move(docs));
}
StupidMetaStore meta;
MatchToolsFactory::UP mtf = create_match_tools_factory(req, search_ctx, attr_ctx, meta,
diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.h b/searchcore/src/vespa/searchcore/proton/matching/matcher.h
index bf75dd9da89..24a7d67496f 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/matcher.h
+++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.h
@@ -183,6 +183,11 @@ public:
* @return true if this rankprofile has summary-features enabled
**/
bool canProduceSummaryFeatures() const;
+ /**
+ * Return a session if it exist, and a bool saying if it should exist.
+ */
+ static std::pair<std::shared_ptr<SearchSession>, bool>
+ lookupSearchSession(SessionManager &session_manager, const Request & request);
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp b/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp
index 21bfbd25af0..76ddf80aa54 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp
@@ -28,7 +28,8 @@ SearchSession::OwnershipBundle::OwnershipBundle(MatchContext && match_context,
: search_handler(std::move(searchHandler)),
context(std::move(match_context)),
feature_overrides(),
- readGuard()
+ readGuard(),
+ stackDump()
{}
SearchSession::OwnershipBundle::OwnershipBundle() noexcept = default;
diff --git a/searchcore/src/vespa/searchcore/proton/matching/search_session.h b/searchcore/src/vespa/searchcore/proton/matching/search_session.h
index d044ce456be..7cdb79f003c 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/search_session.h
+++ b/searchcore/src/vespa/searchcore/proton/matching/search_session.h
@@ -33,6 +33,7 @@ public:
MatchContext context;
std::unique_ptr<search::fef::Properties> feature_overrides;
IDocumentMetaStoreContext::IReadGuard::SP readGuard;
+ std::vector<char> stackDump;
};
private:
using SessionId = vespalib::string;
@@ -64,6 +65,9 @@ public:
vespalib::steady_time getTimeOfDoom() const { return _time_of_doom; }
MatchToolsFactory &getMatchToolsFactory() { return *_match_tools_factory; }
+ vespalib::stringref getStackDump() const noexcept {
+ return {_owned_objects.stackDump.data(), _owned_objects.stackDump.size()};
+ }
};
}