]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib/Geocode.php
apply rank restrictions already when scanning search_name table
[nominatim.git] / lib / Geocode.php
index cc846f54d1896293143c3a5a452ca70c7229549b..6d5796228d13eeca69dc99a2ca0b5229f8321d30 100644 (file)
                                                                        if (CONST_Debug) var_dump($sSQL);
                                                                        $aPlaceIDs = $this->oDB->getCol($sSQL);
                                                                }
+                                                               else
+                                                               {
+                                                                       $aPlaceIDs = array();
+                                                               }
                                                        }
                                                        else
                                                        {
                                                                }
                                                        }
                                                        if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
-                                                       if ($aSearch['sHouseNumber']) $aTerms[] = "address_rank between 16 and 27";
+                                                       if ($aSearch['sHouseNumber'])
+                                                       {
+                                                               $aTerms[] = "address_rank between 16 and 27";
+                                                       }
+                                                       else
+                                                       {
+                                                               if ($this->iMinAddressRank > 0)
+                                                               {
+                                                                       $aTerms[] = "address_rank >= ".$this->iMinAddressRank;
+                                                               }
+                                                               if ($this->iMaxAddressRank < 30)
+                                                               {
+                                                                       $aTerms[] = "address_rank <= ".$this->iMaxAddressRank;
+                                                               }
+                                                       }
                                                        if ($aSearch['fLon'] && $aSearch['fLat'])
                                                        {
                                                                $aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
                                                                $sPlaceIDs = join(',',$aPlaceIDs);
 
                                                                // Now they are indexed look for a house attached to a street we found
-                                                               $sHouseNumberRegex = '\\\\m'.str_replace(' ','[-,/ ]',$aSearch['sHouseNumber']).'\\\\M';
-                                                               $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and housenumber ~* E'".$sHouseNumberRegex."'";
+                                                               $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M';
+                                                               $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and transliteration(housenumber) ~* E'".$sHouseNumberRegex."'";
                                                                if (sizeof($this->aExcludePlaceIDs))
                                                                {
                                                                        $sSQL .= " and place_id not in (".join(',',$this->aExcludePlaceIDs).")";
                                                                                        }
                                                                                        if ($sCountryCodesSQL) $sSQL .= " and lp.calculated_country_code in ($sCountryCodesSQL)";
                                                                                        if ($sOrderBySQL) $sSQL .= "order by ".$sOrderBySQL." asc";
-                                                                                       if ($iOffset) $sSQL .= " offset $iOffset";
+                                                                                       if ($this->iOffset) $sSQL .= " offset $this->iOffset";
                                                                                        $sSQL .= " limit $this->iLimit";
                                                                                        if (CONST_Debug) var_dump($sSQL);
                                                                                        $aClassPlaceIDs = array_merge($aClassPlaceIDs, $this->oDB->getCol($sSQL));
                                                                                        }
                                                                                        if ($sCountryCodesSQL) $sSQL .= " and l.calculated_country_code in ($sCountryCodesSQL)";
                                                                                        if ($sOrderBy) $sSQL .= "order by ".$OrderBysSQL." asc";
-                                                                                       if ($iOffset) $sSQL .= " offset $iOffset";
+                                                                                       if ($this->iOffset) $sSQL .= " offset $this->iOffset";
                                                                                        $sSQL .= " limit $this->iLimit";
                                                                                        if (CONST_Debug) var_dump($sSQL);
                                                                                        $aClassPlaceIDs = array_merge($aClassPlaceIDs, $this->oDB->getCol($sSQL));
                        }
 
                        $aClassType = getClassTypesWithImportance();
-                       $aRecheckWords = preg_split('/\b/u',$sQuery);
+                       $aRecheckWords = preg_split('/\b[\s,\\-]*/u',$sQuery);
                        foreach($aRecheckWords as $i => $sWord)
                        {
                                if (!$sWord) unset($aRecheckWords[$i]);
                                $sAddress = $aResult['langaddress'];
                                foreach($aRecheckWords as $i => $sWord)
                                {
-                                       if (stripos($sAddress, $sWord)!==false) $iCountWords++;
+                                       if (stripos($sAddress, $sWord)!==false)
+                                       {
+                                               $iCountWords++;
+                                               if (preg_match("/(^|,)\s*$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