From 008db4e25d706c4d80d62c862e171575da5cabc6 Mon Sep 17 00:00:00 2001 From: Maneesh P M Date: Wed, 13 Oct 2021 20:52:02 +0530 Subject: [PATCH] Retrieve SuggestionSearcher from LRU Cache --- src/server/internalServer.cpp | 23 ++++++++++++++++------- src/server/internalServer.h | 8 ++++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index f7c76a14c..4e04b2043 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -151,7 +151,8 @@ InternalServer::InternalServer(Library* library, mp_library(library), mp_nameMapper(nameMapper ? nameMapper : &defaultNameMapper), searcherCache(std::max(getCacheLength("SEARCHER_CACHE_SIZE", mp_library->getBookCount(true, true)*0.1), 1U)), - searchCache(std::max(getCacheLength("SEARCH_CACHE_SIZE", SEARCH_CACHE_SIZE), 1U)) + searchCache(std::max(getCacheLength("SEARCH_CACHE_SIZE", SEARCH_CACHE_SIZE), 1U)), + suggestionSearcherCache(std::max(getCacheLength("SUGGESTION_SEARCHER_CACHE_SIZE", mp_library->getBookCount(true, true)*0.1), 1U)) {} bool InternalServer::start() { @@ -356,13 +357,20 @@ std::unique_ptr InternalServer::build_homepage(const RequestContext& r **/ // TODO: retrieve searcher from caching mechanism -SuggestionsList_t getSuggestions(const zim::Archive* const archive, - const std::string& queryString, int start, int suggestionCount) +SuggestionsList_t getSuggestions(SuggestionSearcherCache& cache, const zim::Archive* const archive, + const std::string& bookId, const std::string& queryString, int start, int suggestionCount) { SuggestionsList_t suggestions; - auto searcher = zim::SuggestionSearcher(*archive); + std::shared_ptr searcher; + try { + searcher = cache.get(bookId); + } catch (std::runtime_error&) { + searcher = make_shared(*archive); + cache.put(bookId, searcher); + } + if (archive->hasTitleIndex()) { - auto search = searcher.suggest(queryString); + auto search = searcher->suggest(queryString); auto srs = search.getResults(start, suggestionCount); for (auto it : srs) { @@ -375,7 +383,7 @@ SuggestionsList_t getSuggestions(const zim::Archive* const archive, std::vector variants = getTitleVariants(queryString); int currCount = 0; for (auto it = variants.begin(); it != variants.end() && currCount < suggestionCount; it++) { - auto search = searcher.suggest(queryString); + auto search = searcher->suggest(queryString); auto srs = search.getResults(0, suggestionCount); for (auto it : srs) { SuggestionItem suggestion(it.getTitle(), kiwix::normalize(it.getTitle()), @@ -492,7 +500,8 @@ std::unique_ptr InternalServer::handle_suggest(const RequestContext& r bool first = true; /* Get the suggestions */ - SuggestionsList_t suggestions = getSuggestions(archive.get(), queryString, start, count); + SuggestionsList_t suggestions = getSuggestions(suggestionSearcherCache, archive.get(), + bookId, queryString, start, count); for(auto& suggestion:suggestions) { MustacheData result; result.set("label", suggestion.getTitle()); diff --git a/src/server/internalServer.h b/src/server/internalServer.h index 2973e45a0..db27ea8dd 100644 --- a/src/server/internalServer.h +++ b/src/server/internalServer.h @@ -44,6 +44,9 @@ extern "C" { namespace kiwix { typedef kainjow::mustache::data MustacheData; +typedef LRUCache> SearcherCache; +typedef LRUCache> SearchCache; +typedef LRUCache> SuggestionSearcherCache; class Entry; class OPDSDumper; @@ -115,8 +118,9 @@ class InternalServer { Library* mp_library; NameMapper* mp_nameMapper; - LRUCache> searcherCache; - LRUCache> searchCache; + SearcherCache searcherCache; + SearchCache searchCache; + SuggestionSearcherCache suggestionSearcherCache; std::string m_server_id; std::string m_library_id;