X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/5d6aabc457e673e825c4cf46585938bcc77aec3b..53dbe58ada3fb34534fa2a1d079c2cbbbe09496c:/lib-php/SearchDescription.php diff --git a/lib-php/SearchDescription.php b/lib-php/SearchDescription.php index 01d06725..fa622e62 100644 --- a/lib-php/SearchDescription.php +++ b/lib-php/SearchDescription.php @@ -19,6 +19,8 @@ class SearchDescription private $aName = array(); /// True if the name is rare enough to force index use on name. private $bRareName = false; + /// True if the name requires to be accompanied by address terms. + private $bNameNeedsAddress = false; /// List of word ids making up the address of the object. private $aAddress = array(); /// List of word ids that appear in the name but should be ignored. @@ -113,6 +115,9 @@ class SearchDescription return false; } } + if ($this->bNameNeedsAddress && empty($this->aAddress)) { + return false; + } return true; } @@ -223,11 +228,15 @@ class SearchDescription * Add the given full-word token to the list of terms to search for in the * name. * - * @param interger iId ID of term to add. + * @param interger iId ID of term to add. + * @param bool bRareName True if the term is infrequent enough to not + * require other constraints for efficient search. */ - public function addNameToken($iId) + public function addNameToken($iId, $bRareName) { $this->aName[$iId] = $iId; + $this->bRareName = $bRareName; + $this->bNameNeedsAddress = false; } /** @@ -237,11 +246,19 @@ class SearchDescription * @param integer iID ID of term to add. * @param bool bSearchable Term should be used to search for result * (i.e. term is not a stop word). + * @param bool bNeedsAddress True if the term is too unspecific to be used + * in a stand-alone search without an address + * to narrow down the search. * @param integer iPhraseNumber Index of phrase, where the partial term * appears. */ - public function addPartialNameToken($iId, $bSearchable, $iPhraseNumber) + public function addPartialNameToken($iId, $bSearchable, $bNeedsAddress, $iPhraseNumber) { + if (empty($this->aName)) { + $this->bNameNeedsAddress = $bNeedsAddress; + } else { + $this->bNameNeedsAddress |= $bNeedsAddress; + } if ($bSearchable) { $this->aName[$iId] = $iId; } else { @@ -250,11 +267,6 @@ class SearchDescription $this->iNamePhrase = $iPhraseNumber; } - public function markRareName() - { - $this->bRareName = true; - } - /** * Set country restriction for the search. * @@ -312,6 +324,7 @@ class SearchDescription { $this->aAddress = array_merge($this->aAddress, $this->aName); $this->bRareName = false; + $this->bNameNeedsAddress = true; $this->aName = array($iId => $iId); $this->iNamePhrase = -1; } @@ -626,7 +639,7 @@ class SearchDescription $aOrder[] = $this->oContext->distanceSQL('centroid'); } elseif ($this->sPostcode) { if (empty($this->aAddress)) { - $aTerms[] = "EXISTS(SELECT place_id FROM location_postcode p WHERE p.postcode = '".$this->sPostcode."' AND ST_DWithin(search_name.centroid, p.geometry, 0.1))"; + $aTerms[] = "EXISTS(SELECT place_id FROM location_postcode p WHERE p.postcode = '".$this->sPostcode."' AND ST_DWithin(search_name.centroid, p.geometry, 0.12))"; } else { $aOrder[] = "(SELECT min(ST_Distance(search_name.centroid, p.geometry)) FROM location_postcode p WHERE p.postcode = '".$this->sPostcode."')"; }