--- dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/24 11:29:57 2362 +++ dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/27 11:40:08 2403 @@ -12,8 +12,11 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.apache.commons.lang3.StringUtils; + 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; @@ -62,15 +65,15 @@ } - result.splitReult = AddressUtils.splitAdresse(adresse); + result.splitResult = AddressUtils.splitAdresse(adresse); - if (result.splitReult.husnr.length() == 0) { + if (result.splitResult.husnr.length() == 0) { result.status = Status.ERROR_MISSING_HOUSENUMBER; return result; } - String vasketVejnavn = AddressUtils.vaskVejnavn( result.splitReult.vej ); + String vasketVejnavn = AddressUtils.vaskVejnavn( result.splitResult.vej ); Long gadeident = postnrVeje.get(vasketVejnavn); @@ -80,44 +83,45 @@ gadeident = helperCache.get(helperSearchKey); } + 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.useGoogle) { - result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitReult.vej ); - result.google = true; + if (config.useOpenStreetMaps) { + result.osmVej = GeocodeHelper.openstreetmapHelper(config, postnr, result.splitResult.vej ); + result.osm = true; - if (result.googleVej != null) { - String googleVasket = AddressUtils.vaskVejnavn( result.googleVej ); - gadeident = postnrVeje.get(googleVasket); - - if (gadeident != null) { - helperCache.put(helperSearchKey, gadeident); - } - } + gadeident = helperWrapper(result.osmVej, postnrVeje, helperSearchKey); } } if ( gadeident == null) { - if (config.useOpenStreetMaps) { - result.osmVej = GeocodeHelper.openstreetmapHelper(postnr, result.splitReult.vej ); - result.osm = true; + if (config.useGoogle) { + result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej ); + result.google = 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.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; @@ -125,7 +129,7 @@ } - String husnrSearch = "" + result.splitReult.husnr + result.splitReult.litra; + String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra; Address addr = gade.get(husnrSearch); if (addr == null) { @@ -135,7 +139,8 @@ result.address = addr; - if (addr.distributor.equals("LUKKET")) { + + if ( StringUtils.equals(addr.distributor, "LUKKET") ) { result.status = Status.STATUS_NOT_COVERED; //Skal vi have en special status til Lukkede adresser ? return result; } @@ -151,6 +156,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>(); @@ -178,31 +200,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) { @@ -259,9 +316,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) { @@ -288,7 +345,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) { @@ -333,6 +390,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) { // /////////////////////////////////////////////////////////////////// @@ -411,6 +479,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") ); @@ -442,11 +517,27 @@ aliasSet.add(vejnavn.replace("skt", "sct") ); aliasSet.add(vejnavn.replace("sct", "skt") ); + + aliasSet.add(vejnavn.replace("john", "j") ); //john f kennedy -> j f kennedy + + + //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") ); + aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo + aliasSet.add(vejnavn.replace("allé", "allú") ); + + 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