From: Sarah Hoffmann Date: Thu, 22 Oct 2020 08:20:16 +0000 (+0200) Subject: adjust secondary order when no addressimportance available X-Git-Tag: v3.6.0~44^2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/788ba6d985a47ac9429ca1af68485668313e73a5 adjust secondary order when no addressimportance available In cases of countries and remote places without an address it is possible that 'addressimportance' comes back empty. Adjust the 'foundorder' to the places importance instead in such cases. Fixes #2023. --- diff --git a/lib/Geocode.php b/lib/Geocode.php index bc81bced..b07d1ade 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -917,21 +917,14 @@ class Geocode $aResult['lon'], $aResult['lat'] ); - // Adjust importance for the number of exact string matches in the result - $iCountWords = 0; - $sAddress = $aResult['langaddress']; - foreach ($aRecheckWords as $i => $sWord) { - if (stripos($sAddress, $sWord)!==false) { - $iCountWords++; - if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) $iCountWords += 0.1; - } - } - - $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right // secondary ordering (for results with same importance (the smaller the better): // - approximate importance of address parts - $aResult['foundorder'] = -$aResult['addressimportance']/10; + if (isset($aResult['addressimportance']) && $aResult['addressimportance']) { + $aResult['foundorder'] = -$aResult['addressimportance']/10; + } else { + $aResult['foundorder'] = -$aResult['importance']; + } // - number of exact matches from the query $aResult['foundorder'] -= $aResults[$aResult['place_id']]->iExactMatches; // - importance of the class/type @@ -941,6 +934,19 @@ class Geocode } else { $aResult['foundorder'] += 0.01; } + + // Adjust importance for the number of exact string matches in the result + $iCountWords = 0; + $sAddress = $aResult['langaddress']; + foreach ($aRecheckWords as $i => $sWord) { + if (stripos($sAddress, $sWord)!==false) { + $iCountWords++; + if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) $iCountWords += 0.1; + } + } + + // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right + $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); } $aSearchResults[$iIdx] = $aResult; }