diff --git a/search/ranker.cpp b/search/ranker.cpp index 5bd854bb1d..a1a87c8961 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -7,9 +7,6 @@ #include "search/pre_ranking_info.hpp" #include "search/ranking_utils.hpp" #include "search/token_slice.hpp" -#include "search/utils.hpp" - -#include "editor/editable_data_source.hpp" #include "indexer/brands_holder.hpp" #include "indexer/data_source.hpp" @@ -95,6 +92,17 @@ vector> ModifyStrasse(vector cons return result; } +vector RemoveStreetSynonyms(vector const & tokens) +{ + vector res; + for (auto const & e : tokens) + { + if (!IsStreetSynonym(e)) + res.push_back(e); + } + return res; +} + NameScores GetNameScores(FeatureType & ft, Geocoder::Params const & params, TokenRange const & range, Model::Type type) { @@ -115,8 +123,20 @@ NameScores GetNameScores(FeatureType & ft, Geocoder::Params const & params, UpdateNameScores(vec, lang, slice, bestScores); UpdateNameScores(vec, lang, sliceNoCategories, bestScores); + /// @todo + /// 1. Make sure that this conversion also happens for Address and POI results, + /// where street is only one component. + /// 2. Make an optimization: If there are no synonyms or "strasse", skip this step. if (type == Model::TYPE_STREET) { + // Searching for "Santa Fe" should rank "Avenida Satna Fe" like FULL_MATCH or FULL_PREFIX, but not SUBSTRING. + { + TokensVector cleaned(RemoveStreetSynonyms(vec.GetTokens())); + UpdateNameScores(cleaned, lang, slice, bestScores); + UpdateNameScores(cleaned, lang, sliceNoCategories, bestScores); + } + + /// @todo Should definitely add "platz"-"pl". And maybe "gasse"-"g", "allee"-"al"? for (auto & variant : ModifyStrasse(vec.GetTokens())) { TokensVector vec(std::move(variant)); diff --git a/search/search_quality/search_quality_tests/real_mwm_tests.cpp b/search/search_quality/search_quality_tests/real_mwm_tests.cpp index b0f92f5b4c..ca944849dc 100644 --- a/search/search_quality/search_quality_tests/real_mwm_tests.cpp +++ b/search/search_quality/search_quality_tests/real_mwm_tests.cpp @@ -922,4 +922,40 @@ UNIT_CLASS_TEST(MwmTestsFixture, BA_RelaxedStreets) TEST_GREATER(count, 5, ()); } } + +UNIT_CLASS_TEST(MwmTestsFixture, Streets_Rank) +{ + // Buenos Aires (Palermo) + ms::LatLon const center(-34.5802699, -58.4124979); + SetViewportAndLoadMaps(center); + + auto const & streetChecker = ftypes::IsStreetOrSquareChecker::Instance(); + + auto const processRequest = [&](std::string const & query, size_t idx) + { + auto request = MakeRequest(query); + auto const & results = request->Results(); + + TEST_GREATER(results.size(), idx, ()); + + bool found = false; + for (size_t i = 0; i < idx && !found; ++i) + { + auto const & r = results[i]; + if (streetChecker(r.GetFeatureType())) + { + TEST_EQUAL(r.GetString(), "Avenida Santa Fe", ()); + TEST_LESS(GetDistanceM(r, center), 1000, ()); + found = true; + } + } + TEST(found, ()); + }; + + /// @todo Street should be highwer than 11. + processRequest("Santa Fe ", 11); + /// @todo Prefix search" gives POIs (Starbucks) near "Avenida Santa Fe". + processRequest("Santa Fe st ", 2); +} + } // namespace real_mwm_tests