X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/16268f92ccd11f0c11fe07b2a001b197af3a5b92..8e0ffde3e0a403d289b91ad720444fd94f3ae210:/lib/Geocode.php diff --git a/lib/Geocode.php b/lib/Geocode.php index cce38de9..58bc3bfc 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -5,6 +5,7 @@ namespace Nominatim; require_once(CONST_BasePath.'/lib/NearPoint.php'); require_once(CONST_BasePath.'/lib/PlaceLookup.php'); require_once(CONST_BasePath.'/lib/ReverseGeocode.php'); +require_once(CONST_BasePath.'/lib/SearchDescription.php'); class Geocode { @@ -367,7 +368,7 @@ class Geocode $this->aAddressRankList = array(); $this->aStructuredQuery = array(); - $this->sAllowedTypesSQLList = False; + $this->sAllowedTypesSQLList = false; $this->loadStructuredAddressElement($sAmenity, 'amenity', 26, 30, false); $this->loadStructuredAddressElement($sStreet, 'street', 26, 30, false); @@ -412,8 +413,7 @@ class Geocode if (sizeof($aPlaceIDs) == 0) return array(); $sLanguagePrefArraySQL = getArraySQL( - array_map("getDBQuoted", - $this->aLangPrefOrder) + array_map("getDBQuoted", $this->aLangPrefOrder) ); // Get the details for display (is this a redundant extra step?) @@ -740,12 +740,15 @@ class Geocode // If the token is valid if (isset($aValidTokens[' '.$sToken])) { - // Recheck if the original word shows up in the query. - $bWordInQuery = false; - if (isset($aSearchTerm['word']) && $aSearchTerm['word']) { - $bWordInQuery = $this->normTerm($aSearchTerm['word'])) !== false; - } foreach ($aValidTokens[' '.$sToken] as $aSearchTerm) { + // Recheck if the original word shows up in the query. + $bWordInQuery = false; + if (isset($aSearchTerm['word']) && $aSearchTerm['word']) { + $bWordInQuery = strpos( + $sNormQuery, + $this->normTerm($aSearchTerm['word']) + ) !== false; + } $aNewSearches = $oCurrentSearch->extendWithFullTerm( $aSearchTerm, $bWordInQuery, @@ -785,18 +788,17 @@ class Geocode $aNewWordsetSearches[] = $oSearch; } } - } } } // Sort and cut - usort($aNewWordsetSearches, 'bySearchRank'); + usort($aNewWordsetSearches, array('Nominatim\SearchDescription', 'bySearchRank')); $aWordsetSearches = array_slice($aNewWordsetSearches, 0, 50); } //var_Dump('
',sizeof($aWordsetSearches)); exit; $aNewPhraseSearches = array_merge($aNewPhraseSearches, $aNewWordsetSearches); - usort($aNewPhraseSearches, 'bySearchRank'); + usort($aNewPhraseSearches, array('Nominatim\SearchDescription', 'bySearchRank')); $aSearchHash = array(); foreach ($aNewPhraseSearches as $iSearch => $aSearch) { @@ -835,12 +837,12 @@ class Geocode // Revisit searches, drop bad searches and give penalty to unlikely combinations. $aGroupedSearches = array(); foreach ($aSearches as $oSearch) { - if (!$oSearch->isValidSearch()) { + if (!$oSearch->isValidSearch($this->aCountryCodes)) { continue; } $iRank = $oSearch->addToRank($iGlobalRank); - if (!isset($aGroupedSearches[$iRank]) { + if (!isset($aGroupedSearches[$iRank])) { $aGroupedSearches[$iRank] = array(); } $aGroupedSearches[$iRank][] = $oSearch; @@ -888,8 +890,7 @@ class Geocode $sNormQuery = $this->normTerm($this->sQuery); $sLanguagePrefArraySQL = getArraySQL( - array_map("getDBQuoted", - $this->aLangPrefOrder) + array_map("getDBQuoted", $this->aLangPrefOrder) ); $sCountryCodesSQL = false; if ($this->aCountryCodes) { @@ -983,7 +984,7 @@ class Geocode $oNewSearch->setPoiSearch( Operator::TYPE, $aSearchTerm['class'], - $aSearchTerm['type'], + $aSearchTerm['type'] ); $aNewSearches[] = $oNewSearch; } @@ -1077,8 +1078,8 @@ class Geocode foreach ($aTokens as $sToken) { // Unknown single word token with a number - assume it is a house number - if (!isset($aValidTokens[' '.$sToken]) && strpos($sToken, ' ') === false && preg_match('/[0-9]/', $sToken)) { - $aValidTokens[' '.$sToken] = array(array('class' => 'place', 'type' => 'house')); + if (!isset($aValidTokens[' '.$sToken]) && strpos($sToken, ' ') === false && preg_match('/^[0-9]+$/', $sToken)) { + $aValidTokens[' '.$sToken] = array(array('class' => 'place', 'type' => 'house', 'word_token' => ' '.$sToken)); } } @@ -1173,13 +1174,13 @@ class Geocode $this->oDB, $sCountryCodesSQL, $bBoundingBoxSearch ? $this->sViewboxSmallSQL : '', - $sViewboxCentreSQL, + $this->sViewboxCentreSQL, $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); } elseif ($oSearch->isOperator(Operator::POSTCODE)) { $aPlaceIDs = $oSearch->queryPostcode( - $oDB, + $this->oDB, $sCountryCodesSQL, $this->iLimit ); @@ -1210,13 +1211,13 @@ class Geocode $aResult = $oSearch->queryHouseNumber( $this->oDB, $aPlaceIDs, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '' + $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); if (sizeof($aResult)) { $searchedHousenumber = $aResult['iHouseNumber']; - $aPlaceIDs = $aResults['aPlaceIDs']; + $aPlaceIDs = $aResult['aPlaceIDs']; } elseif (!$oSearch->looksLikeFullAddress()) { $aPlaceIDs = array(); } @@ -1227,7 +1228,7 @@ class Geocode $aPlaceIDs = $oSearch->queryPoiByOperator( $this->oDB, $aPlaceIDs, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '' + $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); }