X-Git-Url: https://git.openstreetmap.org/nominatim.git/blobdiff_plain/6070c3d1d58fb8737b387e8a3ef1f17fb1eb5d54..4342b28882249a6d460bb7f7e6f6708751497058:/lib-php/tokenizer/legacy_icu_tokenizer.php diff --git a/lib-php/tokenizer/legacy_icu_tokenizer.php b/lib-php/tokenizer/legacy_icu_tokenizer.php index 8cff6f32..70358976 100644 --- a/lib-php/tokenizer/legacy_icu_tokenizer.php +++ b/lib-php/tokenizer/legacy_icu_tokenizer.php @@ -120,14 +120,14 @@ class Tokenizer // Try more interpretations for Tokens that could not be matched. foreach ($aTokens as $sToken) { - if ($sToken[0] == ' ' && !$oValidTokens->contains($sToken)) { - if (preg_match('/^ ([0-9]{5}) [0-9]{4}$/', $sToken, $aData)) { + if ($sToken[0] != ' ' && !$oValidTokens->contains($sToken)) { + if (preg_match('/^([0-9]{5}) [0-9]{4}$/', $sToken, $aData)) { // US ZIP+4 codes - merge in the 5-digit ZIP code $oValidTokens->addToken( $sToken, new Token\Postcode(null, $aData[1], 'us') ); - } elseif (preg_match('/^ [0-9]+$/', $sToken)) { + } elseif (preg_match('/^[0-9]+$/', $sToken)) { // Unknown single word token with a number. // Assume it is a house number. $oValidTokens->addToken( @@ -146,8 +146,10 @@ class Tokenizer private function addTokensFromDB(&$oValidTokens, $aTokens, $sNormQuery) { // Check which tokens we have, get the ID numbers - $sSQL = 'SELECT word_id, word_token, word, class, type, country_code,'; - $sSQL .= ' operator, coalesce(search_name_count, 0) as count'; + $sSQL = 'SELECT word_id, word_token, type'; + $sSQL .= " info->>'cc' as country, info->>'postcode' as postcode,"; + $sSQL .= " info->>'word' as word, info->>'op' as operator,"; + $sSQL .= " info->>'class' as class, info->>'type' as type"; $sSQL .= ' FROM word WHERE word_token in ('; $sSQL .= join(',', $this->oDB->getDBQuotedList($aTokens)).')'; @@ -156,10 +158,54 @@ class Tokenizer $aDBWords = $this->oDB->getAll($sSQL, null, 'Could not get word tokens.'); foreach ($aDBWords as $aWord) { - $oToken = null; $iId = (int) $aWord['word_id']; - if ($aWord['class']) { + switch ($aWord['type']) { + 'C': // country name tokens + if ($aWord['country'] === null + || ($this->aCountryRestriction + && !in_array($aWord['country'], $this->aCountryRestriction)) + ) { + continue; + } + $oToken = new Token\Country($iId, $aWord['country']) + break; + 'H': // house number tokens + $oToken = new Token\HouseNumber($iId, $aWord['word_token']); + break; + 'P': // postcode tokens + // Postcodes are not normalized, so they may have content + // that makes SQL injection possible. Reject postcodes + // that would need special escaping. + if ($aWord['postcode'] === null + || pg_escape_string($aWord['postcode']) == $aWord['postcode'] + ) { + continue; + } + $sNormPostcode = $this->normalizeString($aWord['postcode']); + if (strpos($sNormQuery, $sNormPostcode) === false) { + continue; + } + $oToken = new Token\Postcode($iId, $aWord['postcode'], null); + break; + 'S': // tokens for classification terms (special phrases) + if ($aWord['class'] === null || $aWord['type'] === null + || $aWord['word'] === null + || strpos($sNormQuery, $aWord['word']) === false + ) { + continue; + } + $oToken = new Token\SpecialTerm( + $iId, + $aWord['class'], + $aWord['type'], + $aWord['op'] ? Operator::NEAR : Operator::NONE + ); + break; + default: + continue; + } +/* if ($aWord['class']) { // Special terms need to appear in their normalized form. // (postcodes are not normalized in the word table) $sNormWord = $this->normalizeString($aWord['word']); @@ -198,25 +244,18 @@ class Tokenizer } elseif ($aWord['word_token'][0] == ' ') { $oToken = new Token\Word( $iId, - $aWord['word_token'][0] != ' ', (int) $aWord['count'], substr_count($aWord['word_token'], ' ') ); } else { $oToken = new Token\Partial( $iId, + $aWord['word_token'], (int) $aWord['count'] ); - } + }*/ - if ($oToken) { - // remove any leading spaces - if ($aWord['word_token'][0] == ' ') { - $oValidTokens->addToken(substr($aWord['word_token'], 1), $oToken); - } else { - $oValidTokens->addToken($aWord['word_token'], $oToken); - } - } + $oValidTokens->addToken($aWord['word_token'], $oToken); } } @@ -234,12 +273,10 @@ class Tokenizer for ($i = 0; $i < $iNumWords; $i++) { $sPhrase = $aWords[$i]; - $aTokens[' '.$sPhrase] = ' '.$sPhrase; $aTokens[$sPhrase] = $sPhrase; for ($j = $i + 1; $j < $iNumWords; $j++) { $sPhrase .= ' '.$aWords[$j]; - $aTokens[' '.$sPhrase] = ' '.$sPhrase; $aTokens[$sPhrase] = $sPhrase; } }