diff --git a/search/pre_ranker.cpp b/search/pre_ranker.cpp index 6bf133371b..5a7958492f 100644 --- a/search/pre_ranker.cpp +++ b/search/pre_ranker.cpp @@ -258,10 +258,15 @@ void PreRanker::ClearCaches() void PreRanker::FilterForViewportSearch() { auto const & viewport = m_params.m_viewport; + size_t tokensNumber = 0; + strings::Tokenize(m_params.m_query, " ", + [&tokensNumber](auto const & /* token */) { ++tokensNumber; }); - base::EraseIf(m_results, [&viewport](PreRankerResult const & result) { + base::EraseIf(m_results, [&viewport, &tokensNumber](PreRankerResult const & result) { auto const & info = result.GetInfo(); - return !viewport.IsPointInside(info.m_center); + if (!viewport.IsPointInside(info.m_center)) + return true; + return result.GetMatchedTokensNumber() + 1 < tokensNumber; }); SweepNearbyResults(m_params.m_minDistanceOnMapBetweenResults, m_prevEmit, m_results); diff --git a/search/pre_ranker.hpp b/search/pre_ranker.hpp index 965962c5e7..74ce7491a9 100644 --- a/search/pre_ranker.hpp +++ b/search/pre_ranker.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,8 @@ public: bool m_viewportSearch = false; bool m_categorialRequest = false; + + std::string m_query; }; PreRanker(DataSource const & dataSource, Ranker & ranker); diff --git a/search/processor.cpp b/search/processor.cpp index b84e35757e..91758483a5 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -750,6 +750,7 @@ void Processor::InitPreRanker(Geocoder::Params const & geocoderParams, params.m_limit = max(SearchParams::kPreResultsCount, searchParams.m_maxNumResults); params.m_viewportSearch = viewportSearch; params.m_categorialRequest = geocoderParams.IsCategorialRequest(); + params.m_query = searchParams.m_query; m_preRanker.Init(params); }