X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/cc3e4aa532559b5c8948152fb6d4ab68da22fe28..274f38105249c24d355b1f46749c3841ffff6ff0:/website/search.php diff --git a/website/search.php b/website/search.php index d0b183ea..e69ea78d 100755 --- a/website/search.php +++ b/website/search.php @@ -1,4 +1,6 @@ 100) $iLimit = 100; + if ($iFinalLimit > 50) $iFinalLimit = 50; + $iLimit = $iFinalLimit + min($iFinalLimit, 10); $iMinAddressRank = 0; $iMaxAddressRank = 30; @@ -727,6 +730,42 @@ } } + if (CONST_Search_TryDroppedAddressTerms && sizeof($aStructuredQuery) > 0) + { + $aCopyGroupedSearches = $aGroupedSearches; + foreach($aCopyGroupedSearches as $iGroup => $aSearches) + { + foreach($aSearches as $iSearch => $aSearch) + { + $aReductionsList = array($aSearch['aAddress']); + $iSearchRank = $aSearch['iSearchRank']; + while(sizeof($aReductionsList) > 0) + { + $iSearchRank += 5; + if ($iSearchRank > iMaxRank) break 3; + $aNewReductionsList = array(); + foreach($aReductionsList as $aReductionsWordList) + { + for ($iReductionWord = 0; $iReductionWord < sizeof($aReductionsWordList); $iReductionWord++) + { + $aReductionsWordListResult = array_merge(array_slice($aReductionsWordList, 0, $iReductionWord), array_slice($aReductionsWordList, $iReductionWord+1)); + $aReverseSearch = $aSearch; + $aSearch['aAddress'] = $aReductionsWordListResult; + $aSearch['iSearchRank'] = $iSearchRank; + $aGroupedSearches[$iSearchRank][] = $aReverseSearch; + if (sizeof($aReductionsWordListResult) > 0) + { + $aNewReductionsList[] = $aReductionsWordListResult; + } + } + } + $aReductionsList = $aNewReductionsList; + } + } + } + ksort($aGroupedSearches); + } + // Filter out duplicate searches $aSearchHash = array(); foreach($aGroupedSearches as $iGroup => $aSearches) @@ -760,7 +799,7 @@ // Must have a location term if (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['fLon']) { - if ($aSearch['sCountryCode'] && !$aSearch['sClass']) + if ($aSearch['sCountryCode'] && !$aSearch['sClass'] && !$aSearch['sHouseNumber']) { if (4 >= $iMinAddressRank && 4 <= $iMaxAddressRank) { @@ -864,7 +903,7 @@ else $sSQL .= " limit ".$iLimit; - if (CONST_Debug) var_dump($sSQL); + if (CONST_Debug) { var_dump($sSQL); } $aViewBoxPlaceIDs = $oDB->getAll($sSQL); if (PEAR::IsError($aViewBoxPlaceIDs)) { @@ -939,7 +978,7 @@ { $sPlaceIDs = join(',',$aPlaceIDs); - $aResultPlaceIDs = array(); + $aClassPlaceIDs = array(); if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'name') { @@ -949,7 +988,7 @@ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)"; $sSQL .= " order by rank_search asc limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = $oDB->getCol($sSQL); + $aClassPlaceIDs = $oDB->getCol($sSQL); } if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'near') // & in @@ -967,9 +1006,9 @@ if ($iMaxRank < 9 && $bCacheTable) { // Try and get a polygon to search in instead - $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1"; - if (CONST_Debug) var_dump($sSQL); - $sPlaceGeom = $oDB->getOne($sSQL); + $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1"; + if (CONST_Debug) var_dump($sSQL); + $sPlaceGeom = $oDB->getOne($sSQL); } if ($sPlaceGeom) @@ -1020,7 +1059,7 @@ if ($iOffset) $sSQL .= " offset $iOffset"; $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = array_merge($aResultPlaceIDs, $oDB->getCol($sSQL)); + $aClassPlaceIDs = array_merge($aClassPlaceIDs, $oDB->getCol($sSQL)); } else { @@ -1042,12 +1081,12 @@ if ($iOffset) $sSQL .= " offset $iOffset"; $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = array_merge($aResultPlaceIDs, $oDB->getCol($sSQL)); + $aClassPlaceIDs = array_merge($aClassPlaceIDs, $oDB->getCol($sSQL)); } } } - $aPlaceIDs = $aResultPlaceIDs; + $aPlaceIDs = $aClassPlaceIDs; } @@ -1066,6 +1105,7 @@ } if ($iQueryLoop > 20) break; } + //exit; if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs)) break; if ($iGroupLoop > 4) break; @@ -1417,7 +1457,7 @@ } // Absolute limit on number of results - if (sizeof($aSearchResults) >= $iLimit) break; + if (sizeof($aSearchResults) >= $iFinalLimit) break; } $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '1 day'::interval,'YYYY/MM/DD') from import_status limit 1");