From: Sarah Hoffmann Date: Mon, 2 Feb 2015 06:41:28 +0000 (+0100) Subject: order search results by existance of housenumbers X-Git-Tag: deploy~484 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/04d5d12ecd31afcbbc631b6c0997417f68586b52?ds=sidebyside;hp=c1fdb9a915f673239f686ff37da03da10ea1186c order search results by existance of housenumbers When searching for an address with housenumber, include the house number lookup already when searching in search_name so that we do not cut away relevant results in cases where there are too many street pieces. --- diff --git a/lib/Geocode.php b/lib/Geocode.php index 202917a2..2fa170a6 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -555,6 +555,8 @@ // sanity check: if the housenumber is not mainly made // up of numbers, add a penalty if (preg_match_all("/[^0-9]/", $sToken, $aMatches) > 2) $aSearch['iSearchRank']++; + // also housenumbers should appear in the first or second phrase + if ($iPhrase > 1) $aSearch['iSearchRank'] += 1; if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch; /* // Fall back to not searching for this item (better than nothing) @@ -1240,6 +1242,12 @@ $aTerms = array(); $aOrder = array(); + if ($aSearch['sHouseNumber']) + { + $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M'; + $aOrder[] = "exists(select place_id from placex where parent_place_id = search_name.place_id and transliteration(housenumber) ~* E'".$sHouseNumberRegex."' limit 1) desc"; + } + // TODO: filter out the pointless search terms (2 letter name tokens and less) // they might be right - but they are just too darned expensive to run if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'],",")."]"; @@ -1321,7 +1329,7 @@ $sSQL .= " where ".join(' and ',$aTerms); $sSQL .= " order by ".join(', ',$aOrder); if ($aSearch['sHouseNumber'] || $aSearch['sClass']) - $sSQL .= " limit 50"; + $sSQL .= " limit 20"; elseif (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && $aSearch['sClass']) $sSQL .= " limit 1"; else