diff options
author | Anatoly Serdtcev <serdtcev@maps.me> | 2019-05-14 18:00:32 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2019-05-15 15:56:43 +0300 |
commit | 51bf87efa7659062b1d6fb1f3d694cd1de91bf70 (patch) | |
tree | 85fc8305313f1587b8d18b77bd96866831fbfc79 /geocoder | |
parent | c11c41d67738500b0d1eeea7170a775441578cae (diff) |
[geocoder] Fix search of street with number and street synonym together
Diffstat (limited to 'geocoder')
-rw-r--r-- | geocoder/geocoder.cpp | 11 | ||||
-rw-r--r-- | 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 <thread> #include <utility> +#include <boost/optional.hpp> + 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<ScopedMarkTokens> streetSynonymMark; double certainty = 0; vector<Type> 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"#( |