X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/db3ced17bbfff00411f506d8c84419c875959d5e..3933fc3ad335df5b6aba2f4f06eeff3127f16a0d:/lib-php/SearchDescription.php diff --git a/lib-php/SearchDescription.php b/lib-php/SearchDescription.php index 2053082f..cde21f82 100644 --- a/lib-php/SearchDescription.php +++ b/lib-php/SearchDescription.php @@ -219,6 +219,9 @@ class SearchDescription $oSearch = clone $this; $oSearch->iSearchRank++; $oSearch->sHouseNumber = $oSearchTerm->sToken; + if ($this->iOperator != Operator::NONE) { + $oSearch->iSearchRank++; + } // sanity check: if the housenumber is not mainly made // up of numbers, add a penalty if (preg_match('/\\d/', $oSearch->sHouseNumber) === 0 @@ -255,7 +258,7 @@ class SearchDescription ) { if ($this->iOperator == Operator::NONE) { $oSearch = clone $this; - $oSearch->iSearchRank++; + $oSearch->iSearchRank += 2; $iOp = $oSearchTerm->iOperator; if ($iOp == Operator::NONE) { @@ -265,6 +268,11 @@ class SearchDescription $iOp = Operator::NEAR; } $oSearch->iSearchRank += 2; + } else if (!$bFirstToken && !$bLastToken) { + $oSearch->iSearchRank += 2; + } + if ($this->sHouseNumber) { + $oSearch->iSearchRank++; } $oSearch->setPoiSearch( @@ -289,7 +297,7 @@ class SearchDescription $oSearch->aAddress[$iWordID] = $iWordID; $aNewSearches[] = $oSearch; } - } else { + } else if (empty($this->aNameNonSearch)) { $oSearch = clone $this; $oSearch->iSearchRank++; $oSearch->aName = array($iWordID => $iWordID); @@ -329,51 +337,34 @@ class SearchDescription if ((!$bStructuredPhrases || $iPhrase > 0) && (!empty($this->aName)) - && strpos($sToken, ' ') === false ) { + $oSearch = clone $this; + $oSearch->iSearchRank++; + if (preg_match('#^[0-9 ]+$#', $sToken)) { + $oSearch->iSearchRank++; + } if ($oSearchTerm->iSearchNameCount < CONST_Max_Word_Frequency) { - $oSearch = clone $this; - $oSearch->iSearchRank += $oSearchTerm->iTermCount + 1; - if (empty($this->aName)) { - $oSearch->iSearchRank++; - } - if (preg_match('#^[0-9]+$#', $sToken)) { - $oSearch->iSearchRank++; - } $oSearch->aAddress[$iWordID] = $iWordID; - $aNewSearches[] = $oSearch; } else { - $oSearch = clone $this; - $oSearch->iSearchRank += $oSearchTerm->iTermCount + 1; $oSearch->aAddressNonSearch[$iWordID] = $iWordID; if (!empty($aFullTokens)) { $oSearch->iSearchRank++; } - $aNewSearches[] = $oSearch; - - // revert to the token version? - foreach ($aFullTokens as $oSearchTermToken) { - if (is_a($oSearchTermToken, '\Nominatim\Token\Word')) { - $oSearch = clone $this; - $oSearch->iSearchRank += 3; - $oSearch->aAddress[$oSearchTermToken->iId] - = $oSearchTermToken->iId; - $aNewSearches[] = $oSearch; - } - } } + $aNewSearches[] = $oSearch; } if ((!$this->sPostcode && !$this->aAddress && !$this->aAddressNonSearch) - && (empty($this->aName) || $this->iNamePhrase == $iPhrase) + && ((empty($this->aName) && empty($this->aNameNonSearch)) || $this->iNamePhrase == $iPhrase) + && strpos($sToken, ' ') === false ) { $oSearch = clone $this; - $oSearch->iSearchRank += 2; - if (empty($this->aName)) { - $oSearch->iSearchRank += 1; + $oSearch->iSearchRank++; + if (empty($this->aName) && empty($this->aNameNonSearch)) { + $oSearch->iSearchRank++; } - if (preg_match('#^[0-9]+$#', $sToken)) { - $oSearch->iSearchRank += 2; + if (preg_match('#^[0-9 ]+$#', $sToken)) { + $oSearch->iSearchRank++; } if ($oSearchTerm->iSearchNameCount < CONST_Max_Word_Frequency) { if (empty($this->aName) @@ -387,6 +378,9 @@ class SearchDescription } $oSearch->aName[$iWordID] = $iWordID; } else { + if (!empty($aFullTokens)) { + $oSearch->iSearchRank++; + } $oSearch->aNameNonSearch[$iWordID] = $iWordID; } $oSearch->iNamePhrase = $iPhrase; @@ -450,7 +444,11 @@ class SearchDescription // Downgrade the rank of the street results, they are missing // the housenumber. foreach ($aResults as $oRes) { - $oRes->iResultRank++; + if ($oRes->iAddressRank >= 26) { + $oRes->iResultRank++; + } else { + $oRes->iResultRank += 2; + } } $aHnResults = $this->queryHouseNumber($oDB, $aResults); @@ -715,7 +713,7 @@ class SearchDescription $aResults = array(); if (!empty($aTerms)) { - $sSQL = 'SELECT place_id,'.$sExactMatchSQL; + $sSQL = 'SELECT place_id, address_rank,'.$sExactMatchSQL; $sSQL .= ' FROM search_name'; $sSQL .= ' WHERE '.join(' and ', $aTerms); $sSQL .= ' ORDER BY '.join(', ', $aOrder); @@ -728,6 +726,7 @@ class SearchDescription foreach ($aDBResults as $aResult) { $oResult = new Result($aResult['place_id']); $oResult->iExactMatches = $aResult['exactmatch']; + $oResult->iAddressRank = $aResult['address_rank']; $aResults[$aResult['place_id']] = $oResult; } }