[search] Filter street predictions by distance from viewport center/user position/city center.

This commit is contained in:
tatiana-yan 2020-03-18 17:14:20 +03:00 committed by mpimenov
parent 18dcec0e72
commit 7fb3c6a61e
7 changed files with 21 additions and 2 deletions

View file

@ -1168,8 +1168,16 @@ void Geocoder::CreateStreetsLayerAndMatchLowerLayers(BaseContext & ctx,
vector<uint32_t> sortedFeatures;
sortedFeatures.reserve(base::checked_cast<size_t>(prediction.m_features.PopCount()));
prediction.m_features.ForEach([&sortedFeatures](uint64_t bit) {
sortedFeatures.push_back(base::asserted_cast<uint32_t>(bit));
prediction.m_features.ForEach([&](uint64_t bit) {
auto const fid = base::asserted_cast<uint32_t>(bit);
m2::PointD streetCenter;
if (m_context->GetCenter(fid, streetCenter) &&
any_of(centers.begin(), centers.end(), [&](auto const & center) {
return mercator::DistanceOnEarth(center, streetCenter) <= m_params.m_streetSearchRadiusM;
}))
{
sortedFeatures.push_back(base::asserted_cast<uint32_t>(bit));
}
});
layer.m_sortedFeatures = &sortedFeatures;

View file

@ -92,6 +92,7 @@ public:
std::vector<uint32_t> m_cuisineTypes;
std::vector<uint32_t> m_preferredTypes;
std::shared_ptr<Tracer> m_tracer;
double m_streetSearchRadiusM = 0.0;
};
Geocoder(DataSource const & dataSource, storage::CountryInfoGetter const & infoGetter,

View file

@ -729,6 +729,7 @@ void Processor::InitGeocoder(Geocoder::Params & geocoderParams, SearchParams con
geocoderParams.m_cuisineTypes = m_cuisineTypes;
geocoderParams.m_preferredTypes = m_preferredTypes;
geocoderParams.m_tracer = searchParams.m_tracer;
geocoderParams.m_streetSearchRadiusM = searchParams.m_streetSearchRadiusM;
m_geocoder.SetParams(geocoderParams);
}

View file

@ -27,6 +27,7 @@ struct SearchParams
inline static size_t const kDefaultNumResultsEverywhere = 30;
inline static size_t const kDefaultNumResultsInViewport = 200;
inline static size_t const kPreResultsCount = 200;
inline static double const kDefaultStreetSearchRadiusM = 80000;
inline static std::chrono::steady_clock::duration const kDefaultTimeout =
std::chrono::seconds(3);
inline static std::chrono::steady_clock::duration const kDefaultDesktopTimeout =
@ -73,6 +74,9 @@ struct SearchParams
// pre-ranking of viewport search results.
double m_minDistanceOnMapBetweenResults = 0.0;
// Street search radius from pivot or matched city center for everywhere search mode.
double m_streetSearchRadiusM = kDefaultStreetSearchRadiusM;
Mode m_mode = Mode::Everywhere;
// Needed to generate search suggests.

View file

@ -88,6 +88,7 @@ unique_ptr<tests_support::TestSearchRequest> SearchTest::MakeRequest(
params.m_mode = Mode::Everywhere;
params.m_needAddress = true;
params.m_suggestsEnabled = false;
params.m_streetSearchRadiusM = tests_support::TestSearchRequest::kDefaultTestStreetSearchRadiusM;
auto request = make_unique<tests_support::TestSearchRequest>(m_engine, params);
request->Run();

View file

@ -25,6 +25,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q
m_params.m_inputLocale = locale;
m_params.m_viewport = viewport;
m_params.m_mode = mode;
m_params.m_streetSearchRadiusM = kDefaultTestStreetSearchRadiusM;
SetUpCallbacks();
SetUpResultParams();
}
@ -47,6 +48,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q
m_params.m_mode = mode;
m_params.m_onStarted = onStarted;
m_params.m_onResults = onResults;
m_params.m_streetSearchRadiusM = kDefaultTestStreetSearchRadiusM;
SetUpResultParams();
}

View file

@ -25,6 +25,8 @@ class TestSearchEngine;
class TestSearchRequest
{
public:
inline static double const kDefaultTestStreetSearchRadiusM = 2e7;
TestSearchRequest(TestSearchEngine & engine, std::string const & query,
std::string const & locale, Mode mode, m2::RectD const & viewport);
TestSearchRequest(TestSearchEngine & engine, SearchParams const & params);