--- dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2015/05/22 06:43:40 2554 +++ 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); @@ -109,32 +129,36 @@ return result; } - Integer gadeident = request.streetNames.get(result.vasketVejnavn); - + // LookupStreetname er en indkapsling af alm + levenstein + google + osm + Integer gadeident = lookupStretname(request, result, true); - if ( gadeident == null) { - helperSearchKey = "" + request.postnr + "/" + result.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) @@ -213,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 */ @@ -264,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); @@ -301,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); @@ -375,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; @@ -400,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) { @@ -418,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); @@ -437,6 +497,10 @@ return stats; } + public DatabaseLayer getDatabaseLayer() { + return db; + } + public void clear() { searchPostnrVejnavnGadeid.clear(); searchGadeidentAdresser.clear(); @@ -459,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; @@ -485,6 +549,8 @@ return "...." + targetAddress.rute; } break; + default: + System.out.println("Ukendt transport type: " + eb ); } return null; } @@ -500,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; @@ -538,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") ); @@ -547,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") ); @@ -583,10 +665,17 @@ 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 @@ -646,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 @@ -695,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(); }