co-maps/libs/search/query_params.cpp
2025-11-22 13:58:55 +01:00

1588 lines
52 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "search/query_params.hpp"
#include "search/ranking_utils.hpp"
#include "search/token_range.hpp"
#include <unordered_map>
#include <sstream>
namespace search
{
using namespace std;
namespace
{
// All synonyms should be lowercase.
/// @todo These should check the map language and use only the corresponding translation.
unordered_map<string, vector<string>> const kSynonyms = {
/// @todo Should process synonyms with errors like "blvrd" -> "blvd".
/// @see HouseOnStreetSynonymsWithMisprints test.
{"1", {"pierwszy", "pierwsza", "un", "una", "pierwsze", "primo", "واحد", "حادى", "احد"}},
{"1st", {"first"}},
{"", {"primo"}},
{"20", {"venti", "عشرين", "عشرون"}},
{"25", {"venticinque", "خمسه و عشرون", "خمس و عشرين"}},
{"2", {"due", "drugi", "drugie", "druga", "اثنان", "اثنين"}},
{"2nd", {"second"}},
{"3", {"trzecia", "trzecie", "tre", "trzeci", "ثلاث"}},
{"3rd", {"third"}},
{"4", {"quattro", "اربع"}},
{"4th", {"fourth"}},
{"5", {"cinque", "خمس"}},
{"5th", {"fifth"}},
{"6", {"sei", "ست"}},
{"6th", {"sixth"}},
{"7", {"sette", "سبع"}},
{"7th", {"seventh"}},
{"8", {"otto", "ثمان", "ثمانيه"}},
{"8th", {"eighth"}},
{"9", {"nove", "تسع"}},
{"9th", {"ninth"}},
{"10th", {"tenth"}},
{"11th", {"eleventh"}},
{"12th", {"twelfth"}},
{"13th", {"thirteenth"}},
{"14th", {"fourteenth"}},
{"15th", {"fifteenth"}},
{"16th", {"sixteenth"}},
{"17th", {"seventeenth"}},
{"18th", {"eighteenth"}},
{"19th", {"nineteenth"}},
{"20th", {"twentieth"}},
{"a", {"am", "auto-estrada", "aikštė"}},
{"abe", {"abbaye"}},
{"accs", {"access"}},
{"aceq", {"acequia"}},
{"ach", {"ancien chemin"}},
//{"a.d", {"auf der", "an der"}}, // unreachable
{"adi", {"ambodi"}},
{"adm", {"admirała", "admirał"}},
{"afb", {"air force base"}},
{"agl", {"agglomération"}},
{"aha", {"andoha"}},
{"ahi", {"ambohi"}},
{"aire", {"aire", "aires"}},
{"akh", {"allgemeines krankenhaus"}},
{"al", {"alejach", "aleją", "alley", "alei", "alue", "aleja", "alameda", "alle", "aleea", "aleje", "allee"}},
{"alam", {"alameda"}},
{"alea", {"aleea"}},
{"ale", {"aleea"}},
{"alf", {"alferes"}},
{"all", {"alley", "allées", "allée"}},
{"ally", {"alley"}},
{"alm", {"almirante"}},
{"alque", {"alquería"}},
{"alwy", {"alleyway"}},
{"aly", {"alley"}},
{"ambl", {"amble"}},
{"andad", {"andador"}},
{"angb", {"air national guard base"}},
{"angta", {"angosta"}},
{"ani", {"ambony"}},
{"ano", {"andrano"}},
{"anse", {"anse"}},
{"any", {"ambinany"}},
{"aparc", {"aparcament"}},
{"apch", {"approach"}},
{"apdro", {"apeadero"}},
{"apmt", {"apartament"}},
{"app", {"approach"}},
{"aprt", {"airport"}},
{"apt", {"apartat", "apartment"}},
{"apto", {"apartamento"}},
{"aptos", {"apartamentos"}},
{"apts", {"apartments"}},
{"arb", {"arboleda"}},
{"arc", {"arcade", "arcades"}},
{"arq", {"arquiteto", "arquitecto"}},
{"arqº", {"arquiteto", "arquitecto"}},
{"arral", {"arrabal"}},
{"arry", {"arroyo"}},
{"art", {"anciennes routes", "ancienne route"}},
{"artl", {"arterial"}},
{"arty", {"artery"}},
{"as", {"asema"}},
{"asi", {"ampasi"}},
{"ass", {"associação"}},
{"asz", {"altstoffsammelzentrum"}},
{"àt", {"àtic"}},
{"ato", {"ambato"}},
{"atr", {"ambohitr"}},
{"auk", {"aukio"}},
{"aut", {"autoroute"}},
{"auto", {"autopista"}},
{"autop", {"autopista"}},
{"autov", {"autovía", "autovia"}},
{"avª", {"avenida"}},
{"av", {"avinguda", "avenida", "avenue"}},
{"avda", {"avinguda", "avenida"}},
{"avd", {"avinguda", "avenida"}},
{"ave", {"avenue"}},
{"awg", {"awang"}},
{"az", {"azinhaga"}},
{"ba", {"banan"}},
{"balnr", {"balneario"}},
{"barda", {"barriada"}},
{"basn", {"basin"}},
{"bast", {"baston"}},
{"bat", {"batalionu", "batalion", "batalionów", "bataliony"}},
{"bayer", {"bayerische", "bayerisch", "bayerischer", "bayerisches"}},
{"b", {"berg", "barri", "bach", "barriada", "banda", "bairro", "bad", "bei"}},
{"bc", {"beco"}},
{"bch", {"bas chemin", "beach"}},
{"bcle", {"boucle"}},
{"bco", {"beco"}},
{"bda", {"banda", "baixada"}},
{"bd", {"boulevard", "bulevardul"}},
{"", {"bưu điện"}},
{"bdge", {"bridge"}},
{"bdul", {"bulevardul"}},
{"bdwy", {"broadway"}},
{"bdy", {"boundary"}},
{"begi", {"béguinage", "béguinages"}},
{"bend", {"bend"}},
{"ber", {"berges", "berge"}},
{"bez", {"bezirk"}},
{"bg", {"bundesgymnasium", "burg", "berg"}},
{"bgld", {"burgenländische", "burgenländisches", "burgenländischer"}},
{"bgm", {"bürgermeister"}},
{"bgy", {"barangay"}},
{"bhf", {"bahnhof"}},
{"bibl", {"biblioteca"}},
{"bk", {"back"}},
{"", {"błogosławionego", "błogosławiona", "błogosławionej", "błogosławieni", "błogosławionych", "błogosławiony"}},
{"bl", {"bulvar", "bulvarı", "bowl", "bloc", "bloco"}},
{"bldg", {"building"}},
{"bldgs", {"buildings"}},
{"bldngs", {"buildings"}},
{"blk", {"block"}},
{"blq", {"bloque"}},
{"blv", {"bulvar", "bulevardul"}},
{"blvd", {"boulevard", "bulevardul"}},
{"blvr", {"bulevar"}},
{"blvrd", {"boulevard"}},
{"bnc", {"barranc"}},
{"bnd", {"bend"}},
{"", {"bairro"}},
{"bo", {"barrio"}},
{"boul", {"boulevard"}},
{"bpa", {"biskupa", "biskup"}},
{"bp", {"biskupa", "biskup"}},
{"bpd", {"bundespolizeidirektion"}},
{"bps", {"bypass"}},
{"bqllo", {"barranquil"}},
{"branc", {"barranco"}},
{"br", {"bridge", "brücke", "broeder", "brae", "bairro", "brace"}},
{"brdg", {"bridge"}},
{"bre", {"barrières", "barrière"}},
{"brg", {"brigadeiro", "bourg", "bundesrealgymnasium"}},
{"brgy", {"barangay"}},
{"bri", {"bridge"}},
{"brk", {"break", "brook"}},
{"bro", {"brother"}},
{"brw", {"brow"}},
{"bsn", {"basin"}},
{"bstd", {"bastide"}},
{"bt", {"bukit"}},
{"bul", {"bulevardul"}},
{"bulevard", {"bulevardul"}},
{"bulevardu", {"bulevardul"}},
{"bulev", {"bulevardul"}},
{"bulw", {"bulwar"}},
{"burg", {"burgemeester"}},
{"bus", {"business"}},
{"but", {"butte"}},
{"bv", {"bombeiros voluntários"}},
{"bvd", {"boulevard"}},
{"bway", {"broadway"}},
{"bwlk", {"boardwalk"}},
{"bwy", {"broadway"}},
{"bxs", {"baixos"}},
{"bypa", {"bypass"}},
{"byp", {"bypass"}},
{"bywy", {"byway"}},
{"cac", {"cacique"}},
{"", {"companhia"}},
{"cal", {"calea"}},
{"cale", {"cale"}},
{"callej", {"callejón"}},
{"cam", {"caminho", "camino"}},
{"campg", {"camping"}},
{"cant", {"cantón", "cantonada"}},
{"canti", {"cantina"}},
{"cantr", {"cantera"}},
{"cap", {"capitão"}},
{"capt", {"capitan", "captain"}},
{"car", {"carrefour", "carré"}},
{"care", {"carrières", "carrière"}},
{"carr", {"carré"}},
{"carref", {"carrefour"}},
{"cau", {"carreau"}},
{"caus", {"causeway"}},
{"cav", {"cavée"}},
{"cbtiz", {"cobertizo"}},
{"cc", {"calçada", "centro comercial"}},
{"call", {"calleja", "callejón"}},
{"c", {"cesta", "carrer", "calle", "centre"}},
{"cckq", {"căn cứ không quân"}},
{"ccnh", {"calçadinha"}},
{"cct", {"circuit"}},
{"ccvcn", {"circunvalación"}},
{"cad", {"cadde"}},
{"cd", {"cadde", "caddesi"}},
{"", {"cao đẳng"}},
{"cds", {"cul-de-sac"}},
{"ceb", {"ciclo do ensino básico"}},
{"ce", {"cove"}},
{"cee", {"colexio de educación especial", "colegio de educación especial"}},
{"cei", {"colegio de educación infantil", "colexio de educación infantil"}},
{"ceip", {"colexio de educación infantil e primaria", "colegio de educación infantil y primaria"}},
{"cel", {"coronel"}},
{"cem", {"cementiri"}},
{"cen", {"center", "centre"}},
{"cft", {"croft"}},
{"cgne", {"campagne"}},
{"ch", {"church", "chaussee", "chemin", "chairman", "chase"}},
{"che", {"chemins", "chemin"}},
{"chem", {"cheminements", "cheminement"}},
{"chi", {"charmille"}},
{"chl", {"chalet"}},
{"chor", {"chorążego", "chorąży"}},
{"chp", {"chapelle"}},
{"chs", {"chaussée", "chaussées"}},
{"cht", {"château"}},
{"chv", {"chemins vicinaux", "chemin vicinal"}},
{"ci", {"circuit"}},
{"cifp", {"centro integrado de formación profesional"}},
{"cint", {"cinturón", "cinturó"}},
{"cir", {"circle"}},
{"circt", {"circuit"}},
{"cite", {"cités", "cité"}},
{"cjla", {"callejuela"}},
{"cjón", {"callejón"}},
{"cjto", {"conjunto"}},
{"ck", {"creek"}},
{"clb", {"câu lạc bộ"}},
{"cl", {"close", "calle"}},
{"cllja", {"calleja"}},
{"cllón", {"callejón"}},
{"cllzo", {"callizo"}},
{"cloi", {"cloître"}},
{"clos", {"clos"}},
{"cm", {"câmara municipal"}},
{"cmdt", {"commandant", "comandante"}},
{"cmn", {"common"}},
{"cmno", {"camino"}},
{"cmpd", {"compound"}},
{"cnc", {"concourse"}},
{"cno", {"camino"}},
{"cnr", {"corner"}},
{"cnvto", {"convento"}},
{"cnwy", {"centreway"}},
{"co", {"county"}},
{"col", {"colonia", "col", "colonel"}},
{"coli", {"collines", "colline"}},
{"col·l", {"col·legi"}},
{"com", {"comissaria"}},
{"comend", {"comendador"}},
{"comm", {"common", "community", "commission"}},
{"compj", {"complejo"}},
{"conc", {"concession"}},
{"con", {"concourse"}},
{"cong", {"congressman"}},
{"cons", {"conselheiro"}},
{"convt", {"convent"}},
{"coop", {"cooperativa", "cooperative"}},
{"cor", {"corniches", "corniche", "coronel"}},
{"corr", {"correus"}},
{"coste", {"costera"}},
{"cote", {"côteau", "côte"}},
{"cott", {"cottage", "cottages"}},
{"cotts", {"cottages"}},
{"cov", {"cove"}},
{"cowy", {"crossway"}},
{"cp", {"codi postal", "col·legi públic"}},
{"cpd", {"compound"}},
{"cpg", {"camping"}},
{"cpl", {"corporal"}},
{"cps", {"copse"}},
{"cpt", {"captain"}},
{"cra", {"colexio rural agrupado", "carrera", "colegio rural agrupado"}},
{"crc", {"circus"}},
{"cr", {"creek", "crescent", "county route", "county road"}},
{"crcs", {"circus"}},
{"crd", {"crossroad"}},
{"cres", {"crescent"}},
{"crk", {"creek"}},
{"crn", {"corner"}},
{"crnrs", {"corners"}},
{"cro", {"carrero"}},
{"cró", {"carreró"}},
{"crois", {"croissant"}},
{"cross", {"crossing"}},
{"crrdo", {"corredor"}},
{"crrlo", {"corralillo"}},
{"crs", {"cours"}},
{"crsg", {"crossing"}},
{"crss", {"cross"}},
{"crst", {"crest"}},
{"crt", {"court"}},
{"crtil", {"carretil"}},
{"crtjo", {"cortijo"}},
{"csac", {"cul-de-sac"}},
{"cs", {"cross"}},
{"čs", {"československé", "československého", "československých"}},
{"csg", {"crossing"}},
{"csl", {"casal"}},
{"čsl", {"československej", "československé", "československého", "československých"}},
{"cso", {"corso"}},
{"csrio", {"caserío"}},
{"cstan", {"costanilla"}},
{"cst", {"castel", "crest"}},
{"cswy", {"causeway"}},
{"cta", {"cuesta"}},
{"ct", {"court", "công trường"}},
{"ctcp", {"công ty cổ phần"}},
{"ctra", {"carretera"}},
{"ctr", {"center", "contour", "centre"}},
{"ctre", {"central", "centre"}},
{"ctrin", {"carreterín"}},
{"ctrl", {"central"}},
{"cty", {"city", "công ty"}},
{"cty cp", {"công ty cổ phần"}},
{"ctyd", {"courtyard"}},
{"cutt", {"cutting"}},
{"cv", {"công viên", "cove", "cave"}},
{"cve", {"curve"}},
{"cvn", {"caravan"}},
{"cvvh", {"công viên văn hóa"}},
{"cway", {"causeway"}},
{"cyd", {"courtyard"}},
{"czada", {"calzada"}},
{"", {"dona"}},
{"dars", {"darse"}},
{"dav", {"deutscher alpenverein"}},
{"d´", {"de"}},
{"d", {"dom", "dona"}},
{"đ", {"đường"}},
{"deg", {"degrés", "degré"}},
{"demar", {"demarcación"}},
{"dep", {"deputado"}},
{"dep't", {"department"}},
{"dept", {"department", "departamento"}},
{"devn", {"deviation"}},
{"df", {"dorf"}},
{"đh", {"đại học"}},
{"dhsa", {"dehesa"}},
{"diag", {"diagonal"}},
{"dig", {"digues", "digue"}},
{"disem", {"diseminado"}},
{"distr", {"districte"}},
{"divers", {"diversion"}},
{"dkm", {"denkmal"}},
{"đl", {"đại lộ"}},
{"dle", {"dale"}},
{"dln", {"dolna", "dolne", "dolny"}},
{"dn", {"down", "downs"}},
{"dom", {"domaine", "domaines"}},
{"dq", {"duque"}},
{"dra", {"doctora", "doutora"}},
{"drª", {"doutora"}},
{"dr", {"doktora", "doktorky", "doktor", "dokter", "doctor", "drive", "doutora", "doutor", "doktora"}},
{"drec", {"drecera"}},
{"drs", {"doctorandus"}},
{"drv", {"drive"}},
{"drwy", {"driveway"}},
{"ds", {"dominee"}},
{"đs", {"đường sắt"}},
{"dsg", {"descentes", "descente"}},
{"dstr", {"distributor"}},
{"dta", {"dreta"}},
{"dt", {"deutsches", "deutsch", "deutscher", "deutsche"}},
{"dto", {"direito"}},
{"dv", {"drive"}},
{"dvwy", {"driveway"}},
{"dwy", {"driveway"}},
{"dyg", {"dayang"}},
{"dz", {"duże", "duża", "duży"}},
{"", {"duże", "duża", "duży"}},
{"eb", {"escola básica"}},
{"éch", {"échangeur"}},
{"ecl", {"écluses", "écluse"}},
{"écl", {"écluses", "écluse"}},
{"ed", {"edifício"}},
{"edf", {"edifício"}},
{"edg", {"edge"}},
{"edif", {"edificio"}},
{"e", {"east"}},
{"egl", {"église"}},
{"égl", {"église"}},
{"ehem", {"ehemalige", "ehemaliger", "ehemaliges"}},
{"eighth", {"8th"}},
{"eighteenth", {"18th"}},
{"elb", {"elbow"}},
{"eleventh", {"11th"}},
{"emb", {"embaixador"}},
{"em", {"estrada municipal"}},
{"empr", {"empresa"}},
{"enc", {"enclos"}},
{"en", {"estrada nacional", "enceinte"}},
{"enf", {"enfermeiro"}},
{"enfo", {"enfermeiro"}},
{"enfº", {"enfermeiro"}},
{"engª", {"engenheira"}},
{"eng", {"engenheira", "engenheiro"}},
{"engº", {"engenheiro"}},
{"entd", {"entrada"}},
{"ent", {"entrance"}},
{"entl", {"entresòl"}},
{"entr", {"entrada"}},
{"env", {"enclave"}},
{"ep", {"empresa pública"}},
{"er", {"estrada regional"}},
{"err", {"errepidea"}},
{"esca", {"escalera"}},
{"escal", {"escalinata"}},
{"esc", {"escalier", "escadas", "escala", "escaliers", "escola"}},
{"escnh", {"escadinhas"}},
{"esgl", {"església"}},
{"eslda", {"espalda"}},
{"espa", {"espace"}},
{"esp", {"esplanade", "esplanades"}},
{"espl", {"esplanade"}},
{"esq", {"esquerdo", "esquina"}},
{"estac", {"estacionament"}},
{"estcn", {"estación"}},
{"estda", {"estrada"}},
{"est", {"estate", "estació"}},
{"estr", {"estrada"}},
{"etang", {"étang"}},
{"étang", {"étang"}},
{"etar", {"estação de tratamento de águas residuais"}},
{"etorb", {"etorbidea"}},
{"eu", {"escola universitària"}},
{"ex", {"extension"}},
{"exp", {"expressway"}},
{"expla", {"explanada"}},
{"expwy", {"expressway"}},
{"expy", {"expressway"}},
{"exten", {"extension"}},
{"ext", {"extension"}},
{"extrm", {"extramuros"}},
{"extrr", {"extrarradio"}},
{"fac", {"facultat"}},
{"fawy", {"fairway"}},
{"fb", {"fabrik"}},
{"fbrca", {"fábrica"}},
{"fca", {"fábrica", "finca"}},
{"fc", {"futebol clube"}},
{"fdc", {"fundacul"}},
{"fd", {"field"}},
{"ff", {"freiwillige feuerwehr"}},
{"fg", {"faubourg"}},
{"fh", {"fachhochschule", "forsthaus"}},
{"fit", {"firetrail"}},
{"fifth", {"5th"}},
{"fifteenth", {"15th"}},
{"first", {"1st"}},
{"flat", {"flat"}},
{"fl", {"flat"}},
{"fnd", {"fundătura"}},
{"folw", {"follow"}},
{"fon", {"fontaine"}},
{"form", {"forum", "formation"}},
{"fos", {"fosses", "fosse"}},
{"fourth", {"4th"}},
{"fourteenth", {"14th"}},
{"foyr", {"foyer"}},
{"fr", {"father", "frontage", "frei"}},
{"frm", {"ferme", "fermes"}},
{"frnt", {"front"}},
{"frtg", {"frontage"}},
{"frwy", {"freeway"}},
{"fshr", {"foreshore"}},
{"fsr", {"forest service road"}},
{"ft", {"fort", "frente"}},
{"ftrk", {"fire track"}},
{"ftwy", {"footway"}},
{"fwy", {"freeway"}},
{"fy", {"fairway", "ferry"}},
{"ga", {"gates", "gate"}},
{"gale", {"galería"}},
{"gal", {"galerie", "general", "galeries"}},
{"garn", {"garenne"}},
{"gbd", {"grand boulevard"}},
{"gde", {"gemeinde"}},
{"gden", {"grands ensembles", "grand ensemble"}},
{"gd", {"gasilski dom"}},
{"gdn", {"gardens", "garden"}},
{"gdns", {"gardens"}},
{"gebr", {"gebroeders"}},
{"gen", {"generaal", "generała", "generála", "general"}},
{"geo", {"george"}},
{"g", {"gata", "gasse", "großes", "großer", "gatan", "große", "gaten", "gate", "gatvė"}},
{"gg", {"gang"}},
{"ghf", {"gasthof"}},
{"gh", {"gasthaus"}},
{"gi", {"gardu induk"}},
{"g:la", {"gamla"}},
{"glde", {"glade"}},
{"gld", {"glade"}},
{"glen", {"glen"}},
{"gl", {"glade", "gammel,gamle"}},
{"gln", {"glen"}},
{"gly", {"gully"}},
{"gn", {"green", "gunung"}},
{"gnr", {"guarda nacional republicana"}},
{"gov", {"governor"}},
{"gpe", {"groupe", "groupes"}},
{"gpt", {"groupement"}},
{"gra", {"grange"}},
{"grg", {"gymnasium und realgymnasium"}},
{"gr", {"grande rue", "grandes rues", "gracht", "grandrue", "gränd", "graben", "grovet", "gränden", "grove", "großes", "große", "großer"}},
{"gri", {"grille"}},
{"grim", {"grimpette"}},
{"grnd", {"ground"}},
{"grnds", {"grounds"}},
{"grn", {"górny", "green", "górna", "górne"}},
{"gro", {"grove"}},
{"gta", {"glorieta"}},
{"gte", {"gates", "gate"}},
{"gt", {"gata", "gaten", "gate"}},
{"gwy", {"gateway"}},
{"hab", {"habitação", "habitació"}},
{"hak", {"handelsakademie"}},
{"ham", {"hameau", "hameaux"}},
{"harbr", {"harbour"}},
{"hasch", {"handelsschule"}},
{"hbf", {"hauptbahnhof"}},
{"hbr", {"harbor", "harbour"}},
{"hch", {"haut chemin", "hauts chemins"}},
{"hd", {"head", "heads"}},
{"hghlds", {"highlands"}},
{"hgts", {"heights"}},
{"h", {"höhle", "hohes", "hotel", "hohe", "hoher"}},
{"hint", {"hinteres", "hinterer", "hinter", "hintere"}},
{"hip", {"hippodrome"}},
{"hipód", {"hipódromo"}},
{"hird", {"highroad"}},
{"hiway", {"highway"}},
{"hj", {"haji"}},
{"hle", {"halle", "halles"}},
{"hl", {"heiliger", "heiliges", "heilige", "hill", "hills"}},
{"hlm", {"hlm"}},
{"hls", {"hills"}},
{"ho", {"house"}},
{"hon", {"honorable"}},
{"hosp", {"hospital"}},
{"hrd", {"highroad"}},
{"hr", {"hrabiego", "hrabiny", "hrabia", "hrabina"}},
{"hse", {"house"}},
{"hs", {"haus", "high school"}},
{"hst", {"haltestelle"}},
{"ht", {"heights", "hinteres", "hinterer", "hinter…", "hintere"}},
{"htl", {"höhere technische lehranstalt"}},
{"hts", {"heights"}},
{"htt", {"hütte"}},
{"hvn", {"haven"}},
{"hwy", {"highway"}},
{"ic", {"itinerário complementar"}},
{"ies", {"instituto de educación secundaria"}},
{"iii", {"terza", "trzecie", "trzeci", "trzecia", "terzo"}},
{"ii", {"seconda", "drugi", "druga", "secondo", "segundo", "drugie"}},
{"ile", {"île"}},
{"ima", {"irmã"}},
{"imª", {"irmã"}},
{"im", {"irmã", "irmão"}},
{"imm", {"immeubles", "immeuble"}},
{"imo", {"irmão"}},
{"imº", {"irmão"}},
{"imp", {"impasse", "impasses"}},
{"ind", {"industrial"}},
{"inf", {"infante"}},
{"ing", {"inžiniera", "inžinierky", "ingenieur", "inženýra", "inženýrky"}},
{"inst", {"instituto"}},
{"intg", {"interchange"}},
{"int", {"interior", "internationaler", "intrarea", "internationales", "internationale"}},
{"intl", {"international"}},
{"intrarea", {"intrarea"}},
{"intr", {"intrarea"}},
{"ip", {"itinerário principal", "idrottsplats"}},
{"i", {"prima", "pierwszy", "pierwsza", "in", "island", "pierwsze", "primo", "im"}},
{"ir", {"ingenieur", "insinyur"}},
{"is", {"island"}},
{"iv", {"quattro", "quarta", "quarto"}},
{"ix", {"nona", "nono"}},
{"jard", {"jardins", "jardin"}},
{"jctn", {"junction"}},
{"jdín", {"jardín"}},
{"jend", {"jenderal"}},
{"jh", {"jagdhaus"}},
{"jhr", {"jonkheer"}},
{"jhtt", {"jagdhütte"}},
{"jl", {"jalan"}},
{"jln", {"jalan"}},
{"jnc", {"junction"}},
{"jrd", {"jardim"}},
{"jr", {"júnior", "junior"}},
{"jte", {"jetées", "jetée"}},
{"kab", {"kabupaten"}},
{"kag", {"kagawad"}},
{"ka", {"kereta api", "kläranlage"}},
{"kan", {"kanunnik"}},
{"kap", {"kapelle", "kapitan"}},
{"kapt", {"kapitan"}},
{"kard", {"kardinaal", "kardynał"}},
{"kcn", {"khu công nghiệp"}},
{"kdl", {"khu du lịch"}},
{"kec", {"kecamatan"}},
{"kel", {"kelurahan"}},
{"kga", {"kleingartenanlage"}},
{"kgg", {"kagalang-galang"}},
{"kg", {"katastralgemeinde", "…kogel", "kampong", "kogel"}},
{"kgv", {"kleingartenverein"}},
{"kh", {"krankenhaus"}},
{"kj", {"kuja"}},
{"k", {"kalea", "katu", "koło", "kolo", "kort(e)"}},
{"kl", {"konzentrationslager", "klein…", "kleines", "kleiner", "kleine", "kylä"}},
{"knm", {"khu nghỉ mát"}},
{"kol", {"kolonel", "kolonia"}},
{"kon", {"koning", "koningin"}},
{"kontradm", {"kontradmirała", "kontradmirał"}},
{"kp", {"kampung"}},
{"kpl", {"kapelle"}},
{"kpr", {"kaprala", "kapral"}},
{"kpt", {"kapitana", "kapitan", "kapitána"}},
{"kri", {"kaari"}},
{"ks", {"księdza", "ksiądz", "księcia", "książe", "khách sạn"}},
{"kte", {"kort"}},
{"kz", {"kreuz", "konzentrationslager"}},
{"la", {"lane"}},
{"landng", {"landing"}},
{"lda", {"limitada"}},
{"ldg", {"landing", "lodge"}},
{"ld", {"lieu-dit"}},
{"leve", {"levée"}},
{"lg", {"largo", "lugar"}},
{"lgn", {"lagoon"}},
{"lit", {"little"}},
{"lj", {"loja"}},
{"lkh", {"landeskrankenhaus"}},
{"lk", {"link"}},
{"lkout", {"lookout"}},
{"lkt", {"lookout"}},
{"l", {"lange", "lakes", "lilla"}},
{"ll", {"lille"}},
{"llnra", {"llanura"}},
{"lmts", {"limits"}},
{"ln", {"line", "laan", "lane"}},
{"lnwy", {"laneway"}},
{"loc", {"località"}},
{"lor", {"lorong"}},
{"loteam", {"loteamento"}},
{"lot", {"lotissement", "lotissements"}},
{"low", {"lower"}},
{"lp", {"loop"}},
{"lr", {"lower"}},
{"lt", {"lote", "lieutenant", "little"}},
{"lug", {"lugar"}},
{"luit", {"luitenant"}},
{"lung", {"lungsod"}},
{"lwr", {"lower"}},
{"mag", {"magister"}},
{"mah", {"mahalle"}},
{"maj", {"major"}},
{"malec", {"malecón"}},
{"mal", {"marechal", "maréchal"}},
{"ma", {"maria", "magistratsabteilung"}},
{"man", {"manoir"}},
{"mans", {"mansions"}},
{"mar", {"marche", "marches"}},
{"marsz", {"marszałka (marszałek)"}},
{"maz", {"mazowiecka", "mazowiecki", "mazowieckie"}},
{"md", {"mead"}},
{"mdr", {"meander"}},
{"mdw", {"meadow", "meadows"}},
{"mdws", {"meadows"}},
{"med", {"medical"}},
{"mej", {"mejuffrouw"}},
{"me", {"madre", "mestre"}},
{"mem", {"memorial"}},
{"merc", {"mercado"}},
{"met", {"métro"}},
{"mét", {"métro"}},
{"mevr", {"mevrouw"}},
{"mf", {"maison forestière"}},
{"mgr", {"monseigneur"}},
{"mh", {"mahalle"}},
{"mid", {"middle"}},
{"mil", {"military"}},
{"mi", {"mile"}},
{"min", {"minister", "ministro"}},
{"mjr", {"majora", "major"}},
{"mkt", {"markt", "market"}},
{"", {"mała", "mały", "małe"}},
{"ml", {"mała", "mały", "mall", "małe"}},
{"mln", {"moulin", "moulins"}},
{"m", {"municipal", "miasto"}},
{"mndr", {"meander"}},
{"mn", {"mossèn"}},
{"mnr", {"manor"}},
{"mnt", {"muntele", "maantee"}},
{"mon", {"monument"}},
{"mons", {"monsenhor"}},
{"mpal", {"municipal"}},
{"mq", {"marquês"}},
{"mrdor", {"mirador"}},
{"mr", {"meester", "meander"}},
{"ms", {"middle school"}},
{"mte", {"montée", "montées"}},
{"mtir", {"monestir"}},
{"mt", {"mount", "mont", "muntele"}},
{"mtn", {"mountain", "mountains"}},
{"mto", {"maestro"}},
{"mtrio", {"monasterio"}},
{"mtwy", {"motorway"}},
{"mun", {"municipal"}},
{"mus", {"museum", "museu", "musée"}},
{"mva", {"müllverbrennungsanlage"}},
{"mw", {"mews"}},
{"mwy", {"motorway"}},
{"mz", {"manzana"}},
{"nábr", {"nábrežie"}},
{"nábř", {"nábřeží"}},
{"nac", {"nacional"}},
{"nám", {"námestie", "náměstí"}},
{"n:a", {"norra"}},
{"", {"nossa"}},
{"nd", {"niedere", "niederes", "niederer"}},
{"ndr", {"nordre"}},
{"ne", {"northeast"}},
{"nh", {"nhà hát"}},
{"nhs", {"national high school"}},
{"ninth", {"9th"}},
{"nineteenth", {"19th"}},
{"nk", {"nook"}},
{"nms", {"neue mittelschule"}},
{"n", {"nowy", "nowa", "nossa", "norra", "número", "north", "nosso", "nacional", "nowe"}},
{"", {"niederösterreichischer", "niederösterreichisches", "niederösterreich", "niederösterreichische"}},
{"", {"número"}},
{"nook", {"nook"}},
{"nördl", {"nördlicher", "nördliche", "nördliches"}},
{"no", {"சாலை", "salai", "nomor", "vazhi", "வழி"}},
{"np", {"nationalpark", "national park"}},
{"nra", {"national recreation area"}},
{"nre", {"nombre"}},
{"nr", {"nørre", "nummer"}},
{"nsg", {"naturschutzgebiet"}},
{"ns", {"nossa senhora"}},
{"ntđ", {"nhà thi đấu"}},
{"nte", {"nouvelle route"}},
{"nt", {"nhà thờ"}},
{"ntra", {"nuestra"}},
{"núm", {"número"}},
{"nw", {"nowy", "nowa", "nowe", "northwest"}},
{"nwra", {"national wildlife refuge area"}},
{"nz", {"noordzijde"}},
{"ö:a", {"östra"}},
{"öav", {"österreichischer alpenverein"}},
{"obj", {"objekt"}},
{"ob", {"oberer", "obere", "oberes"}},
{"ögv", {"österreichischer gebirgsverein"}},
{"olv", {"onze-lieve-vrouw"}},
{"o", {"ob"}},
{"", {"oberösterreichisches", "oberösterreich", "oberösterreichische", "oberösterreichischer"}},
{"oo", {"ojców"}},
{"ö", {"östra"}},
{"orch", {"orchard"}},
{"os", {"osiedlu", "osiedle"}},
{"", {"osnovna šola"}},
{"österr", {"österreichisches", "österreichische", "österreichischer"}},
{"östl", {"östlicher", "östliche", "östliches"}},
{"öst", {"österreichisches", "österreichische", "österreichischer"}},
{"ötk", {"österreichischer touristenklub"}},
{"otlk", {"outlook"}},
{"out", {"outlook"}},
{"oz", {"oostzijde"}},
{"pae", {"petite avenue"}},
{"palac", {"palacio"}},
{"pal", {"palais"}},
{"pam", {"pamantasan"}},
{"pant", {"pantano"}},
{"parc", {"parc", "parcel·la", "parcs"}},
{"park", {"park"}},
{"par", {"parada"}},
{"parti", {"particular"}},
{"part", {"particular"}},
{"pas", {"passage"}},
{"pass", {"passage", "passes", "passe", "pass"}},
{"past", {"pastoor"}},
{"path", {"path"}},
{"pat", {"patio"}},
{"pav", {"pavillons", "pavillon", "pavilhão", "pavelló"}},
{"pbdo", {"poblado"}},
{"pblo", {"pueblo"}},
{"pça", {"plaça"}},
{"pch", {"porche", "petit chemin"}},
{"pcp", {"police community precinct"}},
{"pc", {"praça"}},
{"", {"praça"}},
{"pctª", {"praceta"}},
{"pct", {"precinct", "praceta"}},
{"pda", {"pujada"}},
{"pde", {"parade"}},
{"pdís", {"passadís"}},
{"pdse", {"paradise"}},
{"pe", {"padre"}},
{"peri", {"périphérique"}},
{"pgd", {"prostovoljno gasilsko društvo"}},
{"pg", {"pengiran", "passeig"}},
{"pgr", {"penger"}},
{"phil", {"philippines"}},
{"ph", {"phường", "phase"}},
{"phwy", {"pathway"}},
{"piata", {"piața"}},
{"piată", {"piața"}},
{"piaţa", {"piața"}},
{"piaţă", {"piața"}},
{"piață", {"piața"}},
{"piaz", {"piazza"}},
{"pim", {"petite impasse"}},
{"pi", {"polígon industrial"}},
{"pj", {"polícia judiciária"}},
{"pje", {"pasaje"}},
{"pkg", {"parking"}},
{"pkld", {"parklands"}},
{"pko", {"puistikko"}},
{"pk", {"pike", "park", "punt quilomètric"}},
{"pkt", {"pocket"}},
{"pkwy", {"parkway"}},
{"pky", {"parkway"}},
{"plag", {"plages", "plage"}},
{"plan", {"plan"}},
{"plat", {"plateau"}},
{"plci", {"placis"}},
{"ple", {"passerelle", "passerelles"}},
{"plk", {"plukovníka"}},
{"płk", {"pułkownika (pułkownik)"}},
{"pln", {"plaine", "plein"}},
{"pl",
{"placu", "plaça", "platz", "plain", "placem", "planta", "plass", "place", "plaza", "plassen", "plains", "plats",
"platsen", "plac"}},
{"plt", {"plateau", "plateaux"}},
{"plut", {"plutonowego", "plutonowy"}},
{"plza", {"plaza"}},
{"plzla", {"plazuela"}},
{"plz", {"plaza"}},
{"pn", {"passage à niveau"}},
{"pnt", {"pointe", "point"}},
{"pobl", {"població"}},
{"políg", {"polígono"}},
{"pol. ind", {"polígon industrial"}},
{"pol", {"polígon"}},
{"pont", {"ponts", "pont"}},
{"po", {"post office"}},
{"por", {"porucznika", "porucznik", "poručíka"}},
{"porq", {"portique", "portiques"}},
{"port", {"port"}},
{"pot", {"poterne"}},
{"pour", {"pourtour"}},
{"p", {"pfad", "polku", "phường", "pater", "paseo"}},
{"pplk", {"podplukovníka"}},
{"ppłk", {"ppułkownika", "podpułkownika", "podpułkownik"}},
{"ppor", {"pporucznika", "podporucznika", "podporucznik", "podporučíka"}},
{"pq", {"parque"}},
{"pque", {"parque"}},
{"pral", {"principal"}},
{"pre", {"pré"}},
{"presid", {"presidente"}},
{"pres", {"president"}},
{"prk", {"purok"}},
{"prm", {"promenade"}},
{"profª", {"professora"}},
{"prof", {"professora", "professor", "profesora", "profesorky", "profesor"}},
{"proj", {"projectada", "projetada"}},
{"prolng", {"prolongamento"}},
{"prol", {"prolongación"}},
{"prom", {"promenade"}},
{"provl", {"provincial"}},
{"prov", {"province"}},
{"p+r", {"parking relais", "parc relais"}},
{"pr", {"praça", "prinses", "prins", "prospektas"}},
{"prq", {"presquîle"}},
{"prtco", {"pórtico"}},
{"prt", {"petite route"}},
{"prv", {"parvis"}},
{"przla", {"prazuela"}},
{"psge", {"passage"}},
{"psje", {"pasaje"}},
{"psllo", {"pasillo"}},
{"ps", {"pass", "puisto"}},
{"psp", {"polícia de segurança pública"}},
{"pst", {"puiestee"}},
{"psty", {"péristyle"}},
{"ptal", {"portal"}},
{"pţa", {"piața"}},
{"pța", {"piața"}},
{"pta", {"porta", "petite allée", "piața", "petites allées", "puerta"}},
{"ptda", {"partida"}},
{"pte", {"porte", "puente"}},
{"ptge", {"passatge"}},
{"ptilo", {"portillo"}},
{"pto", {"puerto", "pátio"}},
{"pt", {"port", "point", "phi trường"}},
{"ptr", {"petite rue"}},
{"ptway", {"pathway"}},
{"pvt", {"private"}},
{"pway", {"pathway"}},
{"pwy", {"pathway", "parkway"}},
{"pza", {"plaza"}},
{"pzo", {"pasadizo"}},
{"pzta", {"plazoleta"}},
{"qdgl", {"quadrangle"}},
{"qd", {"quadra", "quadrant"}},
{"qdrt", {"quadrant"}},
{"ql", {"quốc lộ"}},
{"q", {"quadra", "quận", "quelle"}},
{"qta", {"quinta"}},
{"qt", {"quảng trường"}},
{"quad", {"quad"}},
{"qua", {"quartier"}},
{"qu", {"quelle", "quai"}},
{"qy", {"quay", "quays"}},
{"qys", {"quays"}},
{"rac", {"raccourci"}},
{"raid", {"raidillon"}},
{"rang", {"rang"}},
{"ra", {"ramble"}},
{"", {"ribeira"}},
{"ras", {"rautatieasema"}},
{"rbla", {"rambla"}},
{"rbra", {"ribera"}},
{"rcda", {"rinconada"}},
{"rch", {"reach"}},
{"rcón", {"rincón"}},
{"rc", {"rés-do-chão"}},
{"rda", {"ronda"}},
{"rdge", {"ridge"}},
{"rdg", {"ridge"}},
{"rdpt", {"rond-point"}},
{"rd", {"road"}},
{"rdsd", {"roadside"}},
{"rds", {"roads"}},
{"rdtj", {"raudteejaam"}},
{"rdt", {"raudtee"}},
{"rdwy", {"roadway"}},
{"rdy", {"roadway"}},
{"rem", {"rempart"}},
{"rep", {"representative"}},
{"resid", {"residencial"}},
{"res", {"reservation", "reserve", "reservoir", "résidence", "résidences", "residencias", "residencia"}},
{"rest", {"rest"}},
{"rge", {"range"}},
{"rg", {"range"}},
{"rgwy", {"ridgeway"}},
{"rh", {"rhein", "rạp hát"}},
{"ribª", {"ribeira"}},
{"rib", {"ribeirão", "ribeira"}},
{"ri", {"rise"}},
{"rise", {"rise"}},
{"riv", {"river"}},
{"rks", {"rocks"}},
{"rle", {"ruelle", "ruelles"}},
{"rmbl", {"ramble"}},
{"rnde", {"ronde"}},
{"rnd", {"round"}},
{"rnge", {"range"}},
{"rn", {"rinne"}},
{"robt", {"robert"}},
{"roc", {"roc", "rocade"}},
{"roqt", {"roquet"}},
{"rotm", {"rotmistrza", "rotmistrz"}},
{"rot", {"rotunda", "rotonda"}},
{"row", {"row"}},
{"rowy", {"right of way"}},
{"rpe", {"rampe"}},
{"rpt", {"rond point"}},
{"r", {"river", "ruine", "regional", "rio", "rue", "rua", "raitti", "rues"}},
{"rsbl", {"rosebowl"}},
{"rs", {"rumah sakit"}},
{"rst", {"rest"}},
{"rsud", {"rumah sakit umum daerah"}},
{"rtda", {"rotonda"}},
{"rtd", {"rotonde"}},
{"rte", {"route", "routes"}},
{"rtn", {"return"}},
{"rt", {"ranta", "retreat", "route"}},
{"rtt", {"retreat"}},
{"rty", {"rotary"}},
{"rvra", {"riviera"}},
{"rvr", {"river"}},
{"rvwy", {"riverway"}},
{"rww", {"rundwanderweg"}},
{"sanat", {"sanatorio"}},
{"santu", {"santuario"}},
{"sarg", {"sargento"}},
{"", {"senhora"}},
{"sa", {"sociedade anónima"}},
{"s:a", {"södra"}},
{"savinj", {"savinjski"}},
{"sbg", {"salzburger", "salzburg"}},
{"sbqt", {"sân bay quốc tế"}},
{"sb", {"sân bay"}},
{"sbwy", {"subway"}},
{"schl", {"schloss"}},
{"sc", {"strada comunale", "sport clube"}},
{"sct", {"scout"}},
{"scv", {"sub-cave"}},
{"sdla", {"stradela"}},
{"sdlg", {"siedlung"}},
{"sdng", {"siding"}},
{"sdn", {"sekolah dasar negeri"}},
{"sdr", {"søndre", "sønder"}},
{"sd", {"strand", "sekolah dasar"}},
{"second", {"2nd"}},
{"sect", {"sector"}},
{"sedra", {"sendera"}},
{"send", {"sendero"}},
{"sen", {"sente", "senator", "sentiers", "sentier", "sentes"}},
{"sent", {"sentier"}},
{"seventh", {"7th"}},
{"seventeenth", {"17th"}},
{"se", {"southeast"}},
{"sgda", {"sagrada"}},
{"sg", {"schottergrube", "sungai", "sandgrube"}},
{"sgt", {"sagrat", "sergeant"}},
{"shs", {"senior high school"}},
{"sh", {"state highway"}},
{"shun", {"shunt"}},
{"shwy", {"state highway"}},
{"sídl", {"sídlisko", "sídliště"}},
{"sixth", {"6th"}},
{"sixteenth", {"16th"}},
{"sk", {"sokak", "sokağı"}},
{"skv", {"skveras"}},
{"slj", {"sobre-loja"}},
{"slov", {"slovenskih"}},
{"slpe", {"slope"}},
{"sman", {"sekolah menengah atas negeri"}},
{"sma", {"sekolah menengah atas"}},
{"smk", {"sekolah menengah kejuruan"}},
{"smpn", {"sekolah menengah pertama negeri"}},
{"smp", {"sekolah menengah pertama"}},
{"smz", {"sozialmedizinisches zentrum"}},
{"snd", {"sound"}},
{"sngl", {"singel"}},
{"snr", {"señor"}},
{"sn", {"san", "sem número"}},
{"soc", {"sociedade"}},
{"sok", {"sokak", "sokağı"}},
{"sort", {"sortida"}},
{"soseaua", {"șoseaua"}},
{"so", {"sitio", "south"}},
{"sos", {"șoseaua"}},
{"spg", {"simpang"}},
{"splaiul", {"splaiul"}},
{"spl", {"splaiul"}},
{"sp", {"strada provinciale", "szkoła podstawowa", "splaiul", "spodnja", "spodnji", "spitze", "spodnje"}},
{"sq", {"square", "superquadra"}},
{"srª", {"senhora"}},
{"sra", {"senhora", "senora", "señora"}},
{"sr", {"srednje", "strada regionale", "senior", "srednja", "senhor", "srednji", "señor", "sister", "state route"}},
{"s", {"santo", "senhora", "sant'", "santa", "south", "são", "san", "södra", "senhor", "see"}},
{"ss", {"simpang susun", "santi", "strada statale", "saints"}},
{"śś", {"świętych", "święci"}},
{"s:ta", {"sankta"}},
{"stª", {"santa"}},
{"sta", {"santa", "station"}},
{"stas", {"santas"}},
{"staz", {"stazione"}},
{"stb", {"steinbruch"}},
{"stde", {"stade"}},
{"ste", {"sainte"}},
{"stg", {"stiege"}},
{"sth", {"south"}},
{"stn", {"station"}},
{"sto", {"santo"}},
{"stº", {"santo"}},
{"stos", {"santos"}},
{"strada", {"strada"}},
{"stra", {"strand", "strada"}},
{"strp", {"strip"}},
{"str", {"strasse", "stary", "stara", "strada", "straat", "stare", "straße"}},
{"strwy", {"stairway"}},
{"s:t", {"sankt"}},
/// @todo Should not duplicate Street synonyms defined in StreetsSynonymsHolder (avoid useless double queries).
/// Remove "street" and "avenue" here, but should update GetNameScore.
{"st",
{"santo", "sant", "sint", "saint", "stara", "street", "stary", "stora", "sankt", "store", "stare", "stig",
"stigen", "sancta", "stotelė"}},
{"št", {"šent"}},
{"stwg", {"steenweg"}},
{"subdiv", {"subdivision"}},
{"subd", {"subdivision"}},
{"südl", {"südliche", "südlicher", "südliches"}},
{"svđ", {"sân vận động"}},
{"sv", {"sveti", "sving", "svetega", "svätého", "svätej", "sveta", "svete", "svingen"}},
{"svwy", {"serviceway"}},
{"sw", {"southwest"}},
{"św", {"świętego", "święci", "świętych", "święty", "święta", "świętej"}},
{"swy", {"serviceway"}},
{"szer", {"szeregowego", "szeregowego"}},
{"tarn", {"tarn"}},
{"tce", {"terrace"}},
{"tct", {"tổng công ty"}},
{"tcty", {"tổng công ty"}},
{"ten", {"tenente"}},
{"tenth", {"10th"}},
{"term", {"terminal"}},
{"terr", {"terrace"}},
{"ter", {"terrace"}},
{"tg", {"tanjong"}},
{"thcs", {"trung học cơ sở"}},
{"thfr", {"thoroughfare"}},
{"third", {"3rd"}},
{"thirteenth", {"13th"}},
{"thor", {"thoroughfare"}},
{"thpt", {"trung học phổ thông"}},
{"th", {"tiểu học", "tienhaara"}},
{"tk", {"taman kanak-kanak"}},
{"tkwy", {"trunkway"}},
{"tline", {"townline"}},
{"tl", {"tỉnh lộ"}},
{"tlwy", {"tollway"}},
{"tn", {"tarn", "tänav", "turn"}},
{"tpke", {"turnpike"}},
{"tpk", {"turnpike"}},
{"tpl", {"terre plein"}},
{"tp", {"thành phố"}},
{"tráns", {"tránsito"}},
{"transv", {"transversal"}},
{"tras", {"trasera"}},
{"tra", {"traverse"}},
{"trav", {"travessa", "travessera", "travessia"}},
{"trce", {"trace"}},
{"tri", {"triangle"}},
{"trk", {"track"}},
{"trlr", {"trailer"}},
{"trl", {"trail"}},
{"trnabt", {"turnabout"}},
{"trn", {"turn", "terrain"}},
{"trrnt", {"torrente"}},
{"tr", {"track", "torre", "tori"}},
{"", {"třída"}},
{"trt", {"tertre", "tertres"}},
{"trval", {"transversal"}},
{"trva", {"travesía"}},
{"trv", {"travessa", "travessia"}},
{"tsse", {"terrasse", "terrasses"}},
{"t", {"tie", "teich"}},
{"tttm", {"trung tâm thương mại"}},
{"tt", {"trung tâm", "thị trấn"}},
{"tun", {"tunnel"}},
{"tüpl", {"truppenübungsplatz"}},
{"tu", {"technische universität"}},
{"tvl", {"taival"}},
{"tv", {"travessa"}},
{"twelfth", {"12th"}},
{"twentieth", {"20th"}},
{"twp", {"township"}},
{"twrs", {"towers"}},
{"twy", {"tollway"}},
{"tx", {"thị xã"}},
{"ukh", {"unfallkrankenhaus"}},
{"ul", {"ulicą", "ulicy", "ulica", "ulice"}},
{"uni", {"universität", "university"}},
{"univ", {"universidade", "university"}},
{"unt", {"unteres", "unterer", "untere"}},
{"upas", {"underpass"}},
{"upr", {"upper"}},
{"ups", {"underpass"}},
{"up", {"upper"}},
{"urb", {"urbanização", "urbanització", "urbanización"}},
{"u", {"unteres", "unterer", "untere", "utca"}},
{"vale", {"vale"}},
{"val", {"vallée", "vallon"}},
{"varful", {"vârful"}},
{"varf", {"vârful"}},
{"va", {"vale"}},
{"v:a", {"västra"}},
{"vbt", {"viện bảo tàng"}},
{"vche", {"vieux chemin"}},
{"vcto", {"viaducto"}},
{"vda", {"viuda"}},
{"vdct", {"viaduct"}},
{"vd", {"van de", "van den", "van der", "vorderer", "vorderes", "vordere"}},
{"vecin", {"vecindario"}},
{"vel", {"veliki", "velike", "veliko", "velika", "velikem"}},
{"ven", {"venelles", "venelle"}},
{"verf", {"verfallen"}},
{"verl", {"verlengde"}},
{"vf", {"vârful"}},
{"vge", {"village", "villages"}},
{"viad", {"viaduct"}},
{"via", {"viaduct"}},
{"view", {"view"}},
{"viii", {"ottavo", "ottava"}},
{"vii", {"settima", "settimo"}},
{"villge", {"village"}},
{"vill", {"village"}},
{"virful", {"vârful"}},
{"vîrful", {"vârful"}},
{"virf", {"vârful"}},
{"visc", {"visconde"}},
{"vi", {"sesta", "sesto"}},
{"vlä", {"väylä"}},
{"vla", {"villa", "villas"}},
{"v.le", {"viale"}},
{"vlls", {"villas"}},
{"vlt", {"vliet"}},
{"vl", {"vila"}},
{"vn", {"vegen", "veien", "veg", "vei"}},
{"voi", {"voie", "voies"}},
{"vord", {"vorderer", "vorderes", "vordere"}},
{"vqg", {"vươn quốc gia"}},
{"vr", {"vrouwe"}},
{"vsta", {"vista"}},
{"vst", {"vista"}},
{"vs", {"volksschule"}},
{"vte", {"vieille route"}},
{"v",
{"västra", "vei", "von", "velike", "veliko", "väg", "via", "quinta", "velikem", "veliki", "vegen", "veien", "veg",
"vägen", "quinto", "velika", "van"}},
{"vvdas", {"viviendas"}},
{"vv", {"vivenda"}},
{"vw", {"view"}},
{"vy", {"valley"}},
{"wadm", {"wiceadmirała", "wiceadmirał"}},
{"walk", {"walk"}},
{"way", {"way"}},
{"westl", {"westliche", "westliches", "westlicher"}},
{"wg", {"weg"}},
{"whrf", {"wharf"}},
{"wh", {"wirtshaus"}},
{"wk", {"walk"}},
{"wkwy", {"walkway"}},
{"wky", {"walkway"}},
{"wlkp", {"wielkopolski", "wielkopolskie", "wielkopolska"}},
{"wlk", {"wielki", "wielkie", "walk", "wielka"}},
{"wm", {"william"}},
{"woj", {"województwie", "województwo"}},
{"wr", {"wiener"}},
{"wsf", {"wasserfall"}},
{"wssf", {"wasserfall"}},
{"ws", {"wiese"}},
{"wtr", {"waters"}},
{"wu", {"wirtschaftsuniversität"}},
{"w", {"wald", "west", "weg"}},
{"wyb", {"wybrzeża", "wybrzeże", "wybrzeżem"}},
{"wynd", {"wynd"}},
{"wyn", {"wynd"}},
{"wy", {"way"}},
{"wz", {"westzijde"}},
{"x", {"decima", "decimo"}},
{"xing", {"crossing"}},
{"xway", {"expressway"}},
{"xxiii", {"ventitreesimo"}},
{"xxiv", {"ventiquattro"}},
{"xx", {"venti"}},
{"xxv", {"venticinque"}},
{"xxx", {"trenta"}},
{"yd", {"yard"}},
{"zac", {"zone d'aménagement concerté"}},
{"zad", {"zone d'aménagement différé"}},
{"za", {"zone artisanale", "zone d'activité"}},
{"zd", {"zdravstveni dom"}},
{"zg", {"zgornja", "zgornji", "zgornje"}},
{"zi", {"zone industrielle"}},
{"zn", {"zona"}},
{"zr", {"zuster"}},
{"zup", {"zone à urbaniser en priorité"}},
{"z", {"zum"}},
{"zz", {"zuidzijde"}},
{"αγ", {"αγίας", "αγίων", "αγίου"}},
{"αει", {"πανεπιστήμιο"}},
{"αλ", {"αλέξανδρου"}},
{"ατ", {"αστυνομικό τμήμα"}},
{"ατει", {"ανώτατο τεχνολογικό εκπαιδευτικό ίδρυμα"}},
{"αφοί", {"αδελφοί"}},
{"αφών", {"αδελφών"}},
{"βασ", {"βασιλέως", "βασιλίσσης"}},
{"β", {"βασιλέως", "βασιλίσσης"}},
{"γρ", {"γρηγορίου"}},
{"δ", {"δήμος"}},
{"δς", {"δημοτικό σχολείο"}},
{"εθν", {"εθνάρχου", "εθνική", "εθνικής"}},
{"ελ", {"ελευθέριος", "ελευθερίου"}},
{"ελτα", {"ταχυδρομείο", "ελληνικά ταχυδρομεία"}},
{"κτ", {"κτίριο"}},
{"λεωφ", {"λεωφόρος"}},
{"λ", {"λίμνη", "λεωφόρος"}},
{"ν", {"νέο", "νέος", "νέα", "νέες", "νησί", "νέοι", "νομός"}},
{"όρ", {"όρος"}},
{"παν", {"πανεπιστήμιο"}},
{"πλ", {"πλατεία"}},
{"ποτ", {"ποταμός"}},
{"π", {"παλαιός", "παλαιό", "παλαιά", "παλαιοί", "παλαιές", "ποταμός"}},
{"στρ", {"στρατηγού"}},
{"τει", {"τεχνολογικό εκπαιδευτικό ίδρυμα"}},
{"ал", {"аллея", "алея"}},
{"б", {"большая", "большой"}},
{"бл", {"блок"}},
{"бол", {"большая", "большой"}},
{"бул", {"булевард", "бульвар"}},
{"вул", {"вулиця"}},
{"вх", {"вход"}},
{"ген", {"генерал"}},
{"гр", {"град"}},
{"дор", {"дорога"}},
{"доц", {"доцент"}},
{"зав", {"завулак"}},
{"кап", {"капитан"}},
{"кв", {"квартал"}},
{"мал", {"малый", "малая"}},
{"мит", {"митрополит"}},
{"м", {"малый", "малая"}},
{"наб", {"набережная", "набережна", "набярэжная"}},
{"нов", {"новый", "новая"}},
{"обл", {"область"}},
{"пер", {"переулок"}},
{"пл", {"площа", "площадь", "площад"}},
{"пров", {"провулок"}},
{"просп", {"проспект"}},
{"проф", {"професор"}},
{"пр", {"проезд", "проспект", "праспект", "провулок", "проїзд", "праезд"}},
{"св", {"святые", "святая", "святого", "святых", "свети", "свято", "святой"}},
{"с", {"село"}},
{"стар", {"старая", "старый"}},
{"туп", {"тупик", "тупік"}},
{"ул", {"улица"}},
{"ш", {"шаша", "шосе", "шоссе"}},
{"ইউপি", {"ইউনিয়ন পরিষদ"}},
{"একনেক", {"জাতীয় অর্থনৈতিক পরিষদের নির্বাহী কমিটি"}},
{"টেশিস", {"টেলিফোন শিল্প সংস্থা"}},
{"ঢাবি", {"ঢাকা বিশ্ববিদ্যালয়"}},
{"পবিস", {"পল্লী বিদ্যুৎ সমিতি"}},
{"পাউবো", {"পানি উন্নয়ন বোর্ড"}},
{"বাগ", {"বাগান"}},
{"বিডি", {"বাংলাদেশ"}},
{"রাজউক", {"রাজধানী উন্নয়ন কর্তৃপক্ষ"}},
{"সওজ", {"সড়ক ও জনপথ অধিদপ্তর"}},
{"", {"সড়ক"}},
{"সে", {"সেতু"}},
{"", {"一般都道", "一般県道", "一般府道", "一般道道"}},
{"一社", {"一般社団法人"}},
{"一財", {"一般財団法人"}},
{"", {"中学校"}},
{"", {"主要地方道"}},
{"", {"医療法人"}},
{"", {"合同会社"}},
{"", {"合名会社"}},
{"", {"国立大学法人", "公立大学法人","大学"}},
{"", {"学校法人"}},
{"", {"小学校"}},
{"", {"有限会社"}},
{"", {"株式会社"}},
{"", {"独立行政法人"}},
{"", {"財団法人"}},
{"", {"合資会社"}},
{"", {"銀行"}},
{"高校", {"高等学校"}},
{"", {"高等学校"}},
{"ش", {"شارع"}},
{"ط", {"طريق"}},
{"م", {"ميدان", "مجاوره", "محطه", "موقف"}},
{"د", {"دكتور"}},
{"ج", {"جامعه"}},
{"ح", {"حى"}},
{"ع", {"عماره"}},
{"احد", {"1"}},
{"واحد", {"1"}},
{"حادى", {"1"}},
{"اثنين", {"2"}},
{"اثنان", {"2"}},
{"ثلاث", {"3"}},
{"اربع", {"4"}},
{"خمس", {"5"}},
{"ست", {"6"}},
{"سبع", {"7"}},
{"ثمان", {"8"}},
{"ثمانيه", {"8"}},
{"تسع", {"9"}},
{"عشر", {"10"}},
{"عشرين", {"20"}},
{"عشرون", {"20"}},
{"الحد", {"الاحد"}},
{"الاحد", {"الحد"}},
{"التلات", {"الثلاثاء"}},
{"الثلاثاء", {"التلات"}},
};
} // namespace
// QueryParams::Token ------------------------------------------------------------------------------
void QueryParams::Token::AddSynonym(string const & s)
{
AddSynonym(strings::MakeUniString(s));
}
void QueryParams::Token::AddSynonym(String const & s)
{
if (!IsStopWord(s))
m_synonyms.push_back(s);
}
string DebugPrint(QueryParams::Token const & token)
{
ostringstream os;
os << "Token [ m_original=" << DebugPrint(token.GetOriginal()) << ", m_synonyms=" << DebugPrint(token.m_synonyms)
<< " ]";
return os.str();
}
// QueryParams -------------------------------------------------------------------------------------
void QueryParams::ClearStreetIndices()
{
class AdditionalCommonTokens
{
set<String> m_strings;
public:
AdditionalCommonTokens()
{
char const * arr[] = {
"the", // English
"der", "zum", "und", "auf", // German
"del", "les", // Spanish
"в", "на" // Cyrillic
};
for (char const * s : arr)
m_strings.insert(NormalizeAndSimplifyString(s));
}
bool Has(String const & s) const { return m_strings.count(s) > 0; }
};
static AdditionalCommonTokens const s_addCommonTokens;
size_t const count = GetNumTokens();
m_isCommonToken.resize(count, false);
for (size_t i = 0; i < count; ++i)
{
auto const & token = GetToken(i).GetOriginal();
if (IsStreetSynonym(token))
{
m_typeIndices[i].clear();
m_isCommonToken[i] = true;
}
else if (s_addCommonTokens.Has(token))
m_isCommonToken[i] = true;
}
}
void QueryParams::Clear()
{
m_tokens.clear();
m_prefixToken.Clear();
m_hasPrefix = false;
m_isCommonToken.clear();
m_typeIndices.clear();
m_langs.Clear();
}
bool QueryParams::IsCategorySynonym(size_t i) const
{
return !GetTypeIndices(i).empty();
}
QueryParams::TypeIndices & QueryParams::GetTypeIndices(size_t i)
{
ASSERT_LESS(i, GetNumTokens(), ());
return m_typeIndices[i];
}
QueryParams::TypeIndices const & QueryParams::GetTypeIndices(size_t i) const
{
ASSERT_LESS(i, GetNumTokens(), ());
return m_typeIndices[i];
}
bool QueryParams::IsPrefixToken(size_t i) const
{
ASSERT_LESS(i, GetNumTokens(), ());
return i == m_tokens.size();
}
QueryParams::Token const & QueryParams::GetToken(size_t i) const
{
ASSERT_LESS(i, GetNumTokens(), ());
return i < m_tokens.size() ? m_tokens[i] : m_prefixToken;
}
QueryParams::Token & QueryParams::GetToken(size_t i)
{
ASSERT_LESS(i, GetNumTokens(), ());
return i < m_tokens.size() ? m_tokens[i] : m_prefixToken;
}
bool QueryParams::IsCommonToken(size_t i) const
{
return i < m_isCommonToken.size() && m_isCommonToken[i];
}
bool QueryParams::IsNumberTokens(TokenRange const & range) const
{
ASSERT(range.IsValid(), (range));
ASSERT_LESS_OR_EQUAL(range.End(), GetNumTokens(), ());
for (size_t i : range)
if (!GetToken(i).AnyOfOriginalOrSynonyms([](String const & s) { return strings::IsASCIINumeric(s); }))
return false;
return true;
}
void QueryParams::RemoveToken(size_t i)
{
ASSERT_LESS(i, GetNumTokens(), ());
if (i == m_tokens.size())
{
m_prefixToken.Clear();
m_hasPrefix = false;
}
else
{
m_tokens.erase(m_tokens.begin() + i);
}
m_typeIndices.erase(m_typeIndices.begin() + i);
}
void QueryParams::AddSynonyms()
{
for (auto & token : m_tokens)
{
string const ss = ToUtf8(MakeLowerCase(token.GetOriginal()));
auto const it = kSynonyms.find(ss);
if (it != kSynonyms.end())
for (auto const & synonym : it->second)
token.AddSynonym(synonym);
}
if (m_hasPrefix)
{
string const ss = ToUtf8(MakeLowerCase(m_prefixToken.GetOriginal()));
auto const it = kSynonyms.find(ss);
if (it != kSynonyms.end())
for (auto const & synonym : it->second)
m_prefixToken.AddSynonym(synonym);
}
}
string DebugPrint(QueryParams const & params)
{
ostringstream os;
os << boolalpha << "QueryParams "
<< "{ m_tokens: " << ::DebugPrint(params.m_tokens) << ", m_prefixToken: " << DebugPrint(params.m_prefixToken)
<< ", m_typeIndices: " << ::DebugPrint(params.m_typeIndices) << ", m_langs: " << DebugPrint(params.m_langs)
<< ", m_isCommonToken: " << ::DebugPrint(params.m_isCommonToken) << " }";
return os.str();
}
} // namespace search