mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-27 06:51:42 +03:00
Try alternative orderings of structured queries that include postal codes
This commit is contained in:
parent
5413abfb1e
commit
aa8c6e5f13
@ -884,7 +884,7 @@
|
|||||||
return $iPlaceID;
|
return $iPlaceID;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadStructuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, $aParams, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank)
|
function loadStructuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, &$aAddressRankList, $aParams, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
|
||||||
{
|
{
|
||||||
if (!isset($_GET[$sKey])) return false;
|
if (!isset($_GET[$sKey])) return false;
|
||||||
$sValue = trim($_GET[$sKey]);
|
$sValue = trim($_GET[$sKey]);
|
||||||
@ -895,5 +895,6 @@
|
|||||||
$iMinAddressRank = $iNewMinAddressRank;
|
$iMinAddressRank = $iNewMinAddressRank;
|
||||||
$iMaxAddressRank = $iNewMaxAddressRank;
|
$iMaxAddressRank = $iNewMaxAddressRank;
|
||||||
}
|
}
|
||||||
|
if ($aItemListValues) $aAddressRankList = array_merge($aAddressRankList, $aItemListValues);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
$iLimit = $iFinalLimit + min($iFinalLimit, 10);
|
$iLimit = $iFinalLimit + min($iFinalLimit, 10);
|
||||||
$iMinAddressRank = 0;
|
$iMinAddressRank = 0;
|
||||||
$iMaxAddressRank = 30;
|
$iMaxAddressRank = 30;
|
||||||
|
$aAddressRankList = array();
|
||||||
$sAllowedTypesSQLList = false;
|
$sAllowedTypesSQLList = false;
|
||||||
|
|
||||||
// Format for output
|
// Format for output
|
||||||
@ -140,19 +141,19 @@
|
|||||||
|
|
||||||
// Structured query?
|
// Structured query?
|
||||||
$aStructuredOptions = array(
|
$aStructuredOptions = array(
|
||||||
array('amenity', 26, 30),
|
array('amenity', 26, 30, false),
|
||||||
array('street', 26, 30),
|
array('street', 26, 30, false),
|
||||||
array('city', 14, 24),
|
array('city', 14, 24, false),
|
||||||
array('county', 9, 13),
|
array('postalcode', 5, 11, array(5, 11)),
|
||||||
array('state', 8, 8),
|
array('county', 9, 13, false),
|
||||||
array('country', 4, 4),
|
array('state', 8, 8, false),
|
||||||
array('postalcode', 5, 11),
|
array('country', 4, 4, false),
|
||||||
);
|
);
|
||||||
$aStructuredQuery = array();
|
$aStructuredQuery = array();
|
||||||
$sAllowedTypesSQLList = '';
|
$sAllowedTypesSQLList = '';
|
||||||
foreach($aStructuredOptions as $aStructuredOption)
|
foreach($aStructuredOptions as $aStructuredOption)
|
||||||
{
|
{
|
||||||
loadStructuredAddressElement($aStructuredQuery, $iMinAddressRank, $iMaxAddressRank, $_GET, $aStructuredOption[0], $aStructuredOption[1], $aStructuredOption[2]);
|
loadStructuredAddressElement($aStructuredQuery, $iMinAddressRank, $iMaxAddressRank, $aAddressRankList, $_GET, $aStructuredOption[0], $aStructuredOption[1], $aStructuredOption[2], $aStructuredOption[3]);
|
||||||
}
|
}
|
||||||
if (sizeof($aStructuredQuery) > 0)
|
if (sizeof($aStructuredQuery) > 0)
|
||||||
{
|
{
|
||||||
@ -356,7 +357,6 @@
|
|||||||
$bStructuredPhrases = false;
|
$bStructuredPhrases = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Convert each phrase to standard form
|
// Convert each phrase to standard form
|
||||||
// Create a list of standard words
|
// Create a list of standard words
|
||||||
// Get all 'sets' of words
|
// Get all 'sets' of words
|
||||||
@ -530,6 +530,17 @@
|
|||||||
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
|
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
elseif ($sPhraseType == 'postalcode')
|
||||||
|
{
|
||||||
|
// We need to try the case where the postal code is the primary element (i.e. no way to tell if it is (postalcode, city) OR (city, postalcode) so try both
|
||||||
|
if (sizeof($aSearch['aName']))
|
||||||
|
{
|
||||||
|
$aSearch['aAddress'] = array_merge($aSearch['aAddress'], $aSearch['aName']);
|
||||||
|
$aSearch['aName'] = array();
|
||||||
|
$aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
|
||||||
|
}
|
||||||
|
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
|
||||||
|
}
|
||||||
elseif (($sPhraseType == '' || $sPhraseType == 'street') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house')
|
elseif (($sPhraseType == '' || $sPhraseType == 'street') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house')
|
||||||
{
|
{
|
||||||
if ($aSearch['sHouseNumber'] === '')
|
if ($aSearch['sHouseNumber'] === '')
|
||||||
@ -1167,6 +1178,7 @@
|
|||||||
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
|
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
|
||||||
$sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
|
$sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
|
||||||
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
|
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
|
||||||
|
if ($aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',',$aAddressRankList).")";
|
||||||
$sSQL .= ") ";
|
$sSQL .= ") ";
|
||||||
if ($sAllowedTypesSQLList) $sSQL .= "and placex.class in $sAllowedTypesSQLList ";
|
if ($sAllowedTypesSQLList) $sSQL .= "and placex.class in $sAllowedTypesSQLList ";
|
||||||
$sSQL .= "and linked_place_id is null ";
|
$sSQL .= "and linked_place_id is null ";
|
||||||
@ -1247,6 +1259,7 @@
|
|||||||
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
|
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
|
||||||
$sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
|
$sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
|
||||||
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
|
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
|
||||||
|
if ($aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',',$aAddressRankList).")";
|
||||||
$sSQL .= ") ";
|
$sSQL .= ") ";
|
||||||
$sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
|
$sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
|
||||||
if (!$bDeDupe) $sSQL .= ",place_id";
|
if (!$bDeDupe) $sSQL .= ",place_id";
|
||||||
|
Loading…
Reference in New Issue
Block a user