--- dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/26 10:39:12 2382 +++ dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/27 12:28:33 2405 @@ -16,6 +16,7 @@ import dk.daoas.daoadresseservice.admin.ServiceConfig; import dk.daoas.daoadresseservice.beans.Address; +import dk.daoas.daoadresseservice.beans.AliasBean; import dk.daoas.daoadresseservice.beans.DataStatisticsBean; import dk.daoas.daoadresseservice.beans.ExtendedBean; import dk.daoas.daoadresseservice.beans.HundredePctBean; @@ -82,44 +83,45 @@ gadeident = helperCache.get(helperSearchKey); } - - if ( gadeident == null) { - if (config.useGoogle) { - result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej ); - result.google = true; - - if (result.googleVej != null) { - String googleVasket = AddressUtils.vaskVejnavn( result.googleVej ); - gadeident = postnrVeje.get(googleVasket); - - if (gadeident != null) { - helperCache.put(helperSearchKey, gadeident); - } - } + if (gadeident == null) { + String best = getbestLevenshteinDistance(vasketVejnavn, postnrVeje); + if (best != null) { + result.levenshtein = true; + gadeident = postnrVeje.get(best); } } + + // Brug OpenStreetMap før vi prøver google + // For google har en request limit, det har OSM ikke! if ( gadeident == null) { if (config.useOpenStreetMaps) { result.osmVej = GeocodeHelper.openstreetmapHelper(config, postnr, result.splitResult.vej ); result.osm = true; - if (result.osmVej != null) { - String osmVasket = AddressUtils.vaskVejnavn( result.osmVej ); - gadeident = postnrVeje.get(osmVasket); - - if (gadeident != null) { - helperCache.put(helperSearchKey, gadeident); - } - } + gadeident = helperWrapper(result.osmVej, postnrVeje, helperSearchKey); + } + } + + if ( gadeident == null) { + if (config.useGoogle) { + result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej ); + result.google = true; + + gadeident = helperWrapper(result.googleVej, postnrVeje, helperSearchKey); } } + + if (gadeident == null) { result.status = Status.ERROR_UNKNOWN_STREETNAME; return result; } + result.gadeident = gadeident; + + Map gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { //Denne søgning må ikke fejle result.status = Status.ERROR_INTERNAL; @@ -127,6 +129,10 @@ } + //Kunne evt klares med Iterables.get fra Guava/Collections + Address firstAddress = gade.values().iterator().next(); + result.vej = firstAddress.vejnavn; + String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra; Address addr = gade.get(husnrSearch); @@ -154,6 +160,23 @@ return result; } + private Long helperWrapper(String vej, Map postnrVeje, String helperSearchKey) { + if (vej == null) + return null; + + String vejVasket = AddressUtils.vaskVejnavn( vej ); + Long gadeident = postnrVeje.get(vejVasket); + + if (gadeident != null) { + helperCache.put(helperSearchKey, gadeident); + } + return gadeident; + + } + + + + public void buildSearchStructures() throws SQLException{ searchPostnrVejnavnGadeid = new HashMap>(); @@ -181,31 +204,66 @@ String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn); Long gadeident = postnrVeje.get(vasketVejnavn); - if (gadeident == null) { + if (gadeident == null) { //postnrVeje.put(vasketVejnavn, a.gadeid); + gadeident = a.gadeid; + Set aliaser = findVejAliaser(a.vejnavn); for(String alias : aliaser) { String vasketAlias = AddressUtils.vaskVejnavn(alias); - postnrVeje.put(vasketAlias, a.gadeid); - } - + postnrVeje.put(vasketAlias, gadeident); + } } - Map gade = searchGadeidentAdresser.get(a.gadeid); + Map gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { gade = new HashMap(); - searchGadeidentAdresser.put(a.gadeid, gade); + searchGadeidentAdresser.put(gadeident, gade); } String husnrSearch = "" + a.husnr + a.husnrbogstav; gade.put(husnrSearch, a); } - //////////////////////////////////////////////////////////////////////////////////////// long start2 = System.currentTimeMillis(); System.out.println("Build, stage1 elapsed: " + (start2-start1) ); - System.out.println("Build -- stage 2 udvidet dækning"); + System.out.println("Build -- stage 2 alias tabel"); + + int vaskCount = 0; + List aliasList = DatabaseLayer.getAliasList(); + for (AliasBean alias : aliasList) { + Map postnrVeje = searchPostnrVejnavnGadeid.get(alias.postnr); + + if (postnrVeje == null) { + //Burde ikke kunne ske - men better safe than sorry + continue; + } + + String vasketVej = AddressUtils.vaskVejnavn(alias.vejnavn); + String vasketAlias = AddressUtils.vaskVejnavn(alias.aliasVejnavn); + + Long gadeident = postnrVeje.get(vasketVej); + if (gadeident == null) { + //Kender ikke den oprindelige vej + continue; + } + + Long aliasIdent = postnrVeje.get(vasketAlias); + + if (aliasIdent == null) { //Vi kender ikke denne variant af vejnavnet + postnrVeje.put(vasketAlias, gadeident); + vaskCount++; + } + + } + System.out.println("Anvendte " + vaskCount + " aliaser fra databasen"); + + + //////////////////////////////////////////////////////////////////////////////////////// + long start3 = System.currentTimeMillis(); + System.out.println("Build, stage2 elapsed: " + (start3-start2) ); + System.out.println("Build -- stage 3 udvidet dækning"); List extDao = DatabaseLayer.getExtendedAdresslist(); for (ExtendedBean eb : extDao) { @@ -262,9 +320,9 @@ idAddressMap = null; ////////////////////////////////////////////////////////////////////////////////////// - long start3 = System.currentTimeMillis(); - System.out.println("Build, stage2 elapsed: " + (start3-start2) ); - System.out.println("Build -- stage 3 - 100pct"); + long start4 = System.currentTimeMillis(); + System.out.println("Build, stage3 elapsed: " + (start4-start3) ); + System.out.println("Build -- stage 4 - 100pct"); Map hundredePct = DatabaseLayer.get100PctList(); for (Address addr : alleAdresser) { @@ -291,7 +349,7 @@ //////////////////////////////////////////////////////////////////////////////////// long stop = System.currentTimeMillis(); - System.out.println("Build, stage3 elapsed: " + (stop-start3) ); + System.out.println("Build, stage3 elapsed: " + (stop-start4) ); System.out.println("Build -- Gathering statistics"); for (Address addr : alleAdresser) { @@ -336,6 +394,17 @@ } + private String getbestLevenshteinDistance(String vasketVejnavn, Map postnrVeje) { + for(String vej : postnrVeje.keySet()) { + if ( StringUtils.getLevenshteinDistance(vasketVejnavn, vej) == 1) { + System.out.println("Levenstein: " + vasketVejnavn + "->" + vej); + return vej; + } + } + + return null; + } + private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) { // /////////////////////////////////////////////////////////////////// @@ -414,6 +483,13 @@ aliasSet.add(vejnavn.replace("dr.", "dronningens") ); aliasSet.add(vejnavn.replace("dr ", "dronningens") ); + aliasSet.add(vejnavn.replace("dronning", "dr") ); + aliasSet.add(vejnavn.replace("dr.", "dronning") ); + aliasSet.add(vejnavn.replace("dr ", "dronning") ); + + aliasSet.add(vejnavn.replace("kng", "kongen") ); + aliasSet.add(vejnavn.replace("kongen", "kng") ); + aliasSet.add(vejnavn.replace("kvt", "kvarter") ); aliasSet.add(vejnavn.replace("kvarter", "kvt") ); @@ -445,10 +521,46 @@ aliasSet.add(vejnavn.replace("skt", "sct") ); aliasSet.add(vejnavn.replace("sct", "skt") ); + aliasSet.add(vejnavn.replace("john", "j") ); //john f kennedy -> j f kennedy + + // Romertal + aliasSet.add(vejnavn.replace("1", "i") ); + aliasSet.add(vejnavn.replace("i", "1") ); + + aliasSet.add(vejnavn.replace("2", "ii") ); + aliasSet.add(vejnavn.replace("ii", "2") ); + + aliasSet.add(vejnavn.replace("3", "iii") ); + aliasSet.add(vejnavn.replace("iii", "3") ); + + aliasSet.add(vejnavn.replace("4", "iv") ); + aliasSet.add(vejnavn.replace("iv", "4") ); + + aliasSet.add(vejnavn.replace("5", "v") ); + aliasSet.add(vejnavn.replace("v", "5") ); + + aliasSet.add(vejnavn.replace("6", "vi") ); + aliasSet.add(vejnavn.replace("vi", "6") ); + + aliasSet.add(vejnavn.replace("7", "vii") ); + aliasSet.add(vejnavn.replace("vii", "7") ); + + aliasSet.add(vejnavn.replace("8", "viii") ); + aliasSet.add(vejnavn.replace("viii", "8") ); + + aliasSet.add(vejnavn.replace("9", "ix") ); + aliasSet.add(vejnavn.replace("ix", "9") ); + + aliasSet.add(vejnavn.replace("10", "x") ); + aliasSet.add(vejnavn.replace("x", "10") ); + //alternative måder at stave vej/gade/alle aliasSet.add(vejnavn.replace("vej", "ve") ); aliasSet.add(vejnavn.replace("vej", "vj") ); + aliasSet.add(vejnavn.replace("vej", "v") ); + aliasSet.add(vejnavn.replace("vej", "vejen") ); + aliasSet.add(vejnavn.replace("vejen", "vej") ); aliasSet.add(vejnavn.replace("alle", "all") ); aliasSet.add(vejnavn.replace("allé", "all") ); @@ -457,6 +569,9 @@ aliasSet.add(vejnavn.replace("gade", "gaed") ); //Fundet i logs.hentruteinfo + aliasSet.add(vejnavn.replace("plads", "pl") ); + aliasSet.add(vejnavn.replace("vænget", "vænge") ); + // Opbyg æøå varianter over alle fundne aliaser