--- dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2015/03/31 13:43:14 2505 +++ dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2015/11/19 15:29:36 2775 @@ -17,6 +17,8 @@ import org.apache.commons.lang3.StringUtils; +import com.jcabi.log.Logger; + import dk.daoas.daoadresseservice.admin.ServiceConfig; import dk.daoas.daoadresseservice.beans.Address; import dk.daoas.daoadresseservice.beans.AliasBean; @@ -27,6 +29,7 @@ import dk.daoas.daoadresseservice.beans.SearchResult; import dk.daoas.daoadresseservice.beans.SearchResult.Status; import dk.daoas.daoadresseservice.db.DatabaseLayer; +import dk.daoas.daoadresseservice.util.DaoUtils; import dk.daoas.daoadresseservice.util.DeduplicateHelper; import dk.daoas.daoadresseservice.util.NaturalOrderComparator; @@ -41,21 +44,40 @@ private DataStatisticsBean stats = new DataStatisticsBean(); - ServiceConfig config; + private DatabaseLayer db; + StreetnameHelper levenshteinHelper; StreetnameHelper googleHelper; StreetnameHelper osmHelper; - public AddressSearch(ServiceConfig config) { - this.config = config; + public AddressSearch(DatabaseLayer db, ServiceConfig config) { + + this.db = db; levenshteinHelper = new LevenshteinStreetnameHelper( this ); googleHelper = new GoogleStreetnameHelper( config ); osmHelper = new OSMStreetnameHelper( config ); } + public Address getAddressSafe(int gadeid, String husnr) throws Exception { + + Map gade = searchGadeidentAdresser.get(gadeid); + + if (gade == null) { + throw new Exception("GadeID ikke fundet"); + } + + Address addr = gade.get(husnr); + + if (addr == null) { + throw new Exception("Adresse ikke ikke fundet"); + } + + return addr; + } + public SearchResult search(String postnrStr, String adresse) { @@ -66,8 +88,6 @@ SearchRequest request = new SearchRequest(); SearchResult result = new SearchResult(); - - String helperSearchKey = ""; try { request.postnr = Short.parseShort(postnrStr); @@ -95,44 +115,50 @@ return result; } - request.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn ); + result.vasketVejnavn = AddressUtils.vaskVejnavn( request.vejnavn ); - if (request.vasketVejnavn.indexOf("pakkebo") > -1 - || request.vasketVejnavn.indexOf("døgnpost") > -1 - || request.vasketVejnavn.indexOf("døgnbo") > -1 - || request.vasketVejnavn.equals("id") + if (result.vasketVejnavn.indexOf("pakkebo") > -1 + || result.vasketVejnavn.indexOf("pakkepost") > -1 + || result.vasketVejnavn.indexOf("postbo") > -1 // postbox/postboks + || result.vasketVejnavn.indexOf("døgnpost") > -1 + || result.vasketVejnavn.indexOf("døgnbo") > -1 // døgnbox // døgnboks + || result.vasketVejnavn.equals("id") ) { result.status = Status.ERROR_POSTBOX; return result; } - Integer gadeident = request.streetNames.get(request.vasketVejnavn); + // LookupStreetname er en indkapsling af alm + levenstein + google + osm + Integer gadeident = lookupStretname(request, result, true); - if ( gadeident == null) { - helperSearchKey = "" + request.postnr + "/" + request.vasketVejnavn; - gadeident = helperCache.get(helperSearchKey); - } - + /* + * Hvis der ikke er direkte hits, prøver vi at skære ord af vejnavn + * + * Denne sektion er MEGET experimental da den øger antallet af kald til google/OSM væsentligt*/ if (gadeident == null) { - String vej = levenshteinHelper.proposeStreetName(request, result); - if (vej != null) { - gadeident = request.streetNames.get(vej); - } - } - - - // Brug OpenStreetMap før vi prøver google - // For google har en request limit, det har OSM ikke! - if ( gadeident == null) { - String vej = osmHelper.proposeStreetName(request, result); - gadeident = helperWrapper(vej, request.streetNames, helperSearchKey); - } - - if ( gadeident == null) { - String vej = googleHelper.proposeStreetName(request, result); - gadeident = helperWrapper(vej, request.streetNames, helperSearchKey); + final int MAX_TRIES = 4; + + String vejnavnParts[] = request.vejnavn.split(" "); + + for (int i=1; i<=MAX_TRIES && i postnrVeje, String helperSearchKey) { if (vej == null) @@ -197,7 +257,7 @@ } - public Map getStretsByPostal(int zip) { + public Map getStretsByPostal(short zip) { return searchPostnrVejnavnGadeid.get(zip); } @@ -211,7 +271,7 @@ long start1 = System.currentTimeMillis(); System.out.println("Build -- stage 1"); - alleAdresser = DatabaseLayer.getAllAdresses(); + alleAdresser = db.getAllAdresses(); /* Mapper mellem db Row ID og adresse noden */ @@ -262,7 +322,7 @@ System.out.println("Build -- stage 2 alias tabel"); int vaskCount = 0; - List aliasList = DatabaseLayer.getAliasList(); + List aliasList = db.getAliasList(); for (AliasBean alias : aliasList) { Map postnrVeje = searchPostnrVejnavnGadeid.get(alias.postnr); @@ -299,7 +359,7 @@ DeduplicateHelper ruteHelper = new DeduplicateHelper(); DeduplicateHelper korelisteHelper = new DeduplicateHelper(); - List extDao = DatabaseLayer.getExtendedAdresslist(); + List extDao = db.getExtendedAdresslist(); for (ExtendedBean eb : extDao) { Address orgAddress = idAddressMap.get(eb.orgId); @@ -356,8 +416,10 @@ orgAddress.dbkBane = targetAddress.dbkBane; /* Sådan gør den gamle service */ - orgAddress.kommunekode = targetAddress.kommunekode; - orgAddress.vejkode = targetAddress.vejkode; + /* 20150520 THN- hvis vi bibeholder de originale kommune+vejkoder kan vi bruge DAVID til join i databasen*/ + //orgAddress.kommunekode = targetAddress.kommunekode; + //orgAddress.vejkode = targetAddress.vejkode; + orgAddress.distributor = targetAddress.distributor; } @@ -371,7 +433,7 @@ System.out.println("Build, stage3 elapsed: " + (start4-start3) ); System.out.println("Build -- stage 4 - 100pct"); - Map hundredePct = DatabaseLayer.get100PctList(); + Map hundredePct = db.get100PctList(); for (Address addr : alleAdresser) { if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) { continue; @@ -396,7 +458,7 @@ //////////////////////////////////////////////////////////////////////////////////// long stop = System.currentTimeMillis(); - System.out.println("Build, stage3 elapsed: " + (stop-start4) ); + System.out.println("Build, stage4 elapsed: " + (stop-start4) ); System.out.println("Build -- Gathering statistics"); for (Address addr : alleAdresser) { @@ -414,11 +476,13 @@ stats.ikkeDaekketCount++; } } + stats.totalCount = alleAdresser.size(); stats.elapsed = stop-start1; stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() ); + System.out.println("Build: totalCount: " + stats.totalCount); System.out.println("Build: direkteCount: " + stats.direkteCount); System.out.println("Build: extendedCount: " + stats.extendedCount); System.out.println("Build: hundredePctCount: " + stats.hundredePctCount); @@ -433,6 +497,10 @@ return stats; } + public DatabaseLayer getDatabaseLayer() { + return db; + } + public void clear() { searchPostnrVejnavnGadeid.clear(); searchGadeidentAdresser.clear(); @@ -455,7 +523,7 @@ return ".." + targetAddress.rute; } else if (eb.afstand < 0.701) { return "..." + targetAddress.rute; - } else if (eb.afstand < 0.501) { + } else if (eb.afstand < 1.001) { return "...." + targetAddress.rute; } break; @@ -481,6 +549,8 @@ return "...." + targetAddress.rute; } break; + default: + System.out.println("Ukendt transport type: " + eb ); } return null; } @@ -496,6 +566,17 @@ return result; } + public List
get100PctAddresses() { + List
result = new ArrayList
(120000); + for (Address a : alleAdresser) { + if ( a.daekningsType == DaekningsType.DAEKNING_100PCT) { + result.add(a); + } + } + Collections.sort(result ); + return result; + } + /////////////////////////////////////////////////////////// private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) { String inject; @@ -511,13 +592,12 @@ vejnavn = vejnavn.toLowerCase(); HashSet aliasSet = new HashSet(); aliasSet.add(vejnavn); - - aliasSet.add(vejnavn.replace("u", "ü") ); - aliasSet.add(vejnavn.replace("ü", "u") ); - + aliasSet.add(vejnavn.replace("alle", "allé") ); aliasSet.add(vejnavn.replace("allé", "alle") ); + + // forkortelser aliasSet.add(vejnavn.replace("dronningens", "dr") ); aliasSet.add(vejnavn.replace("dr.", "dronningens") ); aliasSet.add(vejnavn.replace("dr ", "dronningens") ); @@ -535,6 +615,9 @@ aliasSet.add(vejnavn.replace("gl", "gammel") ); aliasSet.add(vejnavn.replace("gammel", "gl") ); + aliasSet.add(vejnavn.replace("gl", "gamle") ); + aliasSet.add(vejnavn.replace("gamle", "gl") ); + aliasSet.add(vejnavn.replace("lille", "ll") ); aliasSet.add(vejnavn.replace("ll ", "lille") ); aliasSet.add(vejnavn.replace("ll.", "lille") ); @@ -544,7 +627,9 @@ aliasSet.add(vejnavn.replace("st.", "store") ); aliasSet.add(vejnavn.replace("søndre", "sdr") ); - aliasSet.add(vejnavn.replace("sdr", "søndre") ); + aliasSet.add(vejnavn.replace("sdr", "søndre") ); + aliasSet.add(vejnavn.replace("sønder", "sdr") ); + aliasSet.add(vejnavn.replace("sdr", "sønder") ); aliasSet.add(vejnavn.replace("nørre", "nr") ); @@ -552,23 +637,50 @@ aliasSet.add(vejnavn.replace("nordre", "ndr") ); aliasSet.add(vejnavn.replace("ndr", "nordre") ); + + + aliasSet.add(vejnavn.replace("vestre", "vester") ); + aliasSet.add(vejnavn.replace("vester", "vestre") ); + + aliasSet.add(vejnavn.replace("søndre", "sønder") ); + aliasSet.add(vejnavn.replace("sønder", "søndre") ); + + aliasSet.add(vejnavn.replace("østre", "øster") ); + aliasSet.add(vejnavn.replace("øster", "østre") ); + + aliasSet.add(vejnavn.replace("borgmester", "borgm") ); + aliasSet.add(vejnavn.replace("borgm", "borgmester") ); + aliasSet.add(vejnavn.replace("sankt", "skt") ); aliasSet.add(vejnavn.replace("sankt", "sct") ); aliasSet.add(vejnavn.replace("skt", "sankt") ); aliasSet.add(vejnavn.replace("skt", "sct") ); - aliasSet.add(vejnavn.replace("sct", "skt") ); + aliasSet.add(vejnavn.replace("sct", "skt") ); + // fornavn forkortelser aliasSet.add(vejnavn.replace("john", "j") ); aliasSet.add(vejnavn.replace("thomas", "th") ); aliasSet.add(vejnavn.replace("thorvald", "th") ); + aliasSet.add(vejnavn.replace("frederik", "fr") ); + aliasSet.add(vejnavn.replace("frederiks", "fr") ); aliasSet.add(vejnavn.replace("christian", "chr") ); + aliasSet.add(vejnavn.replace("christians", "chr") ); aliasSet.add(vejnavn.replace("kristian", "kr") ); + aliasSet.add(vejnavn.replace("kristians", "kr") ); + + aliasSet.add(vejnavn.replace("mylius", "myl") ); + aliasSet.add(vejnavn.replace("myl", "mylius") ); + + + // alternative stavninger + aliasSet.add(vejnavn.replace("peder", "peter") ); + aliasSet.add(vejnavn.replace("peter", "peder") ); @@ -611,6 +723,8 @@ aliasSet.add(vejnavn.replace("vej", "vejen") ); aliasSet.add(vejnavn.replace("vejen", "vej") ); + aliasSet.add(vejnavn.replace("v", "vej") );//Vi kan have vejnavne i DB der bare slutter på v istedet for vej + aliasSet.add(vejnavn.replace("alle", "all") ); aliasSet.add(vejnavn.replace("allé", "all") ); aliasSet.add(vejnavn.replace("alle", "allú") ); //Fundet i logs.hentruteinfo @@ -621,7 +735,15 @@ aliasSet.add(vejnavn.replace("plads", "pl") ); aliasSet.add(vejnavn.replace("vænget", "vænge") ); - + + aliasSet.add(vejnavn.replace("boulevard", "blvd") ); + aliasSet.add(vejnavn.replace("blvd", "boulevard") ); + + aliasSet.add(vejnavn.replace("boulevard", "boule") ); + aliasSet.add(vejnavn.replace("boule", "boulevard") ); + + aliasSet.add(vejnavn.replace("kronborg", "krbg") ); //Krbg ladegårdsvej, 3000 + aliasSet.add(vejnavn.replace("krbg", "kronborg") ); // Opbyg æøå varianter over alle fundne aliaser @@ -648,6 +770,17 @@ //danske tegn 3 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") ); aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") ); + + + //udenlandsketegn + aliasSet.add(vejnavn.replace("u", "ü") ); + aliasSet.add(vejnavn.replace("ü", "u") ); + + aliasSet.add(vejnavn.replace("ä", "æ") ); + aliasSet.add(vejnavn.replace("æ", "ä") ); + + aliasSet.add(vejnavn.replace("ö", "ø") ); + aliasSet.add(vejnavn.replace("ø", "ö") ); } return aliasSet; @@ -659,10 +792,8 @@ public Set> getVejnavne(short postnr) { Map map = searchPostnrVejnavnGadeid.get(postnr); - TreeMap newMap = new TreeMap(); - for (Entry entry : map.entrySet() ) { - newMap.put(entry.getKey(), entry.getValue()); - } + + TreeMap newMap = new TreeMap( map );//Lav et nyt TreeMap for at sikre sortering return newMap.entrySet(); }