From 51bf87efa7659062b1d6fb1f3d694cd1de91bf70 Mon Sep 17 00:00:00 2001 From: Anatoly Serdtcev Date: Tue, 14 May 2019 18:00:32 +0300 Subject: [PATCH] [geocoder] Fix search of street with number and street synonym together --- geocoder/geocoder.cpp | 11 +++++-- geocoder/geocoder_tests/geocoder_tests.cpp | 36 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/geocoder/geocoder.cpp b/geocoder/geocoder.cpp index 53c62df6a2..8d96fdecec 100644 --- a/geocoder/geocoder.cpp +++ b/geocoder/geocoder.cpp @@ -18,6 +18,8 @@ #include #include +#include + using namespace std; namespace @@ -268,15 +270,18 @@ void Geocoder::Go(Context & ctx, Type type) const continue; ScopedMarkTokens mark(ctx, type, i, j + 1); + boost::optional streetSynonymMark; double certainty = 0; vector allTypes; for (size_t tokId = 0; tokId < ctx.GetNumTokens(); ++tokId) { auto const t = ctx.GetTokenType(tokId); - - if (t == Type::Street && search::IsStreetSynonym(strings::MakeUniString(ctx.GetToken(tokId)))) - continue; + if (type == Type::Street && t == Type::Count && !streetSynonymMark) + { + if (search::IsStreetSynonym(strings::MakeUniString(ctx.GetToken(tokId)))) + streetSynonymMark.emplace(ctx, Type::Street, tokId, tokId + 1); + } certainty += GetWeight(t); if (t != Type::Count) diff --git a/geocoder/geocoder_tests/geocoder_tests.cpp b/geocoder/geocoder_tests/geocoder_tests.cpp index 95ecd182ab..1f61253e59 100644 --- a/geocoder/geocoder_tests/geocoder_tests.cpp +++ b/geocoder/geocoder_tests/geocoder_tests.cpp @@ -153,6 +153,42 @@ UNIT_TEST(Geocoder_MismatchedLocality) TestGeocoder(geocoder, "Moscow Krymskaya 3", {}); } +UNIT_TEST(Geocoder_StreetWithNumber) +{ + string const kData = R"#( +10 {"properties": {"address": {"locality": "Москва"}}} +20 {"properties": {"address": {"locality": "Краснокамск"}}} + +11 {"properties": {"address": {"locality": "Москва", "street": "улица 1905 года"}}} + +12 {"properties": {"address": {"locality": "Москва", "street": "4-я улица 8 Марта"}}} + +13 {"properties": {"address": {"locality": "Москва", "street": "8 Марта"}}} + +21 {"properties": {"address": {"locality": "Краснокамск", "street": "улица 8 Марта"}}} +25 {"properties": {"address": {"locality": "Краснокамск", "street": "Январская улица"}}} +26 {"properties": {"address": {"locality": "Краснокамск", "street": "Январская улица", "building": "8"}}} +)#"; + + ScopedFile const regionsJsonFile("regions.jsonl", kData); + Geocoder geocoder(regionsJsonFile.GetFullPath()); + + using Id = base::GeoObjectId; + TestGeocoder(geocoder, "Москва, улица 1905 года", {{Id{11}, 1.0}}); + TestGeocoder(geocoder, "Москва, 1905 года", {{Id{11}, 1.0}}); + TestGeocoder(geocoder, "Краснокамск, улица 1905 года", {}); + + TestGeocoder(geocoder, "Москва, 4-я улица 8 Марта", {{Id{12}, 1.0}}); + TestGeocoder(geocoder, "Москва, 4-я 8 Марта", {{Id{12}, 1.0}}); + + TestGeocoder(geocoder, "Москва, 8 Марта", {{Id{13}, 1.0}}); + TestGeocoder(geocoder, "Москва, улица 8 Марта", {{Id{13}, 1.0}}); + + TestGeocoder(geocoder, "Краснокамск, улица 8 Марта", {{Id{21}, 1.0}}); + TestGeocoder(geocoder, "Краснокамск, 8 Марта", {{Id{21}, 1.0}}); + TestGeocoder(geocoder, "Краснокамск, Январская 8", {{Id{26}, 1.0}}); +} + UNIT_TEST(Geocoder_LocalityBuilding) { string const kData = R"#(