From 04d5d12ecd31afcbbc631b6c0997417f68586b52 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 2 Feb 2015 07:41:28 +0100 Subject: [PATCH 1/1] 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. --- lib/Geocode.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 -- 2.39.5