Allow option of structured search queries (params amenity,street,city,county,state,country)

This commit is contained in:
Brian Quinion
2012-11-02 17:52:33 +00:00
parent f87ea067ca
commit a0e39b67d5
2 changed files with 90 additions and 27 deletions

View File

@@ -890,3 +890,17 @@
return $iPlaceID; return $iPlaceID;
} }
function loadStructuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, $aParams, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank)
{
if (!isset($_GET[$sKey])) return false;
$sValue = trim($_GET[$sKey]);
if (!$sValue) return false;
$aStructuredQuery[$sKey] = $sValue;
if ($iMinAddressRank == 0 && $iMaxAddressRank == 30) {
$iMinAddressRank = $iNewMinAddressRank;
$iMaxAddressRank = $iNewMaxAddressRank;
}
return true;
}

View File

@@ -101,6 +101,39 @@
$aPhrases = array_reverse($aPhrases); $aPhrases = array_reverse($aPhrases);
$sQuery = join(', ',$aPhrases); $sQuery = join(', ',$aPhrases);
} }
function structuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, $aParams, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank)
{
if (!isset($_GET[$sKey])) return false;
$sValue = trim($_GET[$sKey]);
if (!$sValue) return false;
$aStructuredQuery[$sKey] = $sValue;
if ($iMinAddressRank == 0 && $iMaxAddressRank == 30) {
$iMinAddressRank = $iNewMinAddressRank;
$iMaxAddressRank = $iNewMaxAddressRank;
}
return true;
}
// Structured query?
$aStructuredOptions = array(
array('amenity', 26, 30),
array('street', 26, 30),
array('city', 14, 24),
array('county', 9, 13),
array('state', 8, 8),
array('country', 4, 4),
array('postalcode', 16, 25),
);
$aStructuredQuery = array();
foreach($aStructuredOptions as $aStructuredOption)
{
loadStructuredAddressElement($aStructuredQuery, $iMinAddressRank, $iMaxAddressRank, $_GET, $aStructuredOption[0], $aStructuredOption[1], $aStructuredOption[2]);
}
if (sizeof($aStructuredQuery) > 0) {
$sQuery = join(', ', $aStructuredQuery);
}
if ($sQuery) if ($sQuery)
{ {
$hLog = logStart($oDB, 'search', $sQuery, $aLangPrefOrder); $hLog = logStart($oDB, 'search', $sQuery, $aLangPrefOrder);
@@ -212,7 +245,7 @@
} }
} }
if ($sQuery) if ($sQuery || $aStructuredQuery)
{ {
// Start with a blank search // Start with a blank search
$aSearches = array( $aSearches = array(
@@ -240,6 +273,11 @@
preg_match_all('/\\[([a-zA-Z]*)\\]/', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER); preg_match_all('/\\[([a-zA-Z]*)\\]/', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER);
$aSpecialTerms = array(); $aSpecialTerms = array();
if (isset($aStructuredQuery['amenity']) && $aStructuredQuery['amenity'])
{
$aSpecialTermsRaw[] = array('['.$aStructuredQuery['amenity'].']', $aStructuredQuery['amenity']);
unset($aStructuredQuery['amenity']);
}
foreach($aSpecialTermsRaw as $aSpecialTerm) foreach($aSpecialTermsRaw as $aSpecialTerm)
{ {
$sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery); $sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery);
@@ -274,7 +312,17 @@
// Split query into phrases // Split query into phrases
// Commas are used to reduce the search space by indicating where phrases split // Commas are used to reduce the search space by indicating where phrases split
$aPhrases = explode(',',$sQuery); if (sizeof($aStructuredQuery) > 0)
{
$aPhrases = $aStructuredQuery;
$bStructuredPhrases = true;
}
else
{
$aPhrases = explode(',',$sQuery);
$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
@@ -304,6 +352,7 @@
} }
// reindex phrases - we make assumptions later on // reindex phrases - we make assumptions later on
$aPhraseTypes = array_keys($aPhrases);
$aPhrases = array_values($aPhrases); $aPhrases = array_values($aPhrases);
if (sizeof($aTokens)) if (sizeof($aTokens))
@@ -419,6 +468,8 @@
foreach($aPhrases as $iPhrase => $sPhrase) foreach($aPhrases as $iPhrase => $sPhrase)
{ {
$aNewPhraseSearches = array(); $aNewPhraseSearches = array();
if ($bStructuredPhrases) $sPhraseType = $aPhraseTypes[$iPhrase];
else $sPhraseType = '';
foreach($aPhrases[$iPhrase]['wordsets'] as $aWordset) foreach($aPhrases[$iPhrase]['wordsets'] as $aWordset)
{ {
@@ -443,7 +494,7 @@
{ {
$aSearch = $aCurrentSearch; $aSearch = $aCurrentSearch;
$aSearch['iSearchRank']++; $aSearch['iSearchRank']++;
if ($aSearchTerm['country_code'] !== null && $aSearchTerm['country_code'] != '0') if (($sPhraseType == '' || $sPhraseType == 'country') && $aSearchTerm['country_code'] !== null && $aSearchTerm['country_code'] != '0')
{ {
if ($aSearch['sCountryCode'] === false) if ($aSearch['sCountryCode'] === false)
{ {
@@ -463,7 +514,7 @@
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch; if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
} }
} }
elseif ($aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house') elseif (($sPhraseType == '' || $sPhraseType == 'street') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house')
{ {
if ($aSearch['sHouseNumber'] === '') if ($aSearch['sHouseNumber'] === '')
{ {
@@ -477,7 +528,7 @@
*/ */
} }
} }
elseif ($aSearchTerm['class'] !== '' && $aSearchTerm['class'] !== null) elseif ($sPhraseType == '' && $aSearchTerm['class'] !== '' && $aSearchTerm['class'] !== null)
{ {
if ($aSearch['sClass'] === '') if ($aSearch['sClass'] === '')
{ {
@@ -506,7 +557,7 @@
{ {
if (sizeof($aSearch['aName'])) if (sizeof($aSearch['aName']))
{ {
if (!isset($aValidTokens[$sToken]) || strlen($sToken) < 4 || strpos($sToken, ' ') !== false) if (($sPhraseType != 'street' && $sPhraseType != 'country') && (!isset($aValidTokens[$sToken]) || strlen($sToken) < 4 || strpos($sToken, ' ') !== false))
{ {
$aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id']; $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
} }
@@ -531,25 +582,23 @@
{ {
if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id']) if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id'])
{ {
//var_Dump('<hr>',$aSearch['aName']); if (($sPhraseType != 'street') && sizeof($aCurrentSearch['aName']) && strlen($sToken) >= 4)
{
$aSearch = $aCurrentSearch;
$aSearch['iSearchRank'] += 1;
$aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
}
if (sizeof($aCurrentSearch['aName']) && strlen($sToken) >= 4) if (!sizeof($aCurrentSearch['aName']) || $aCurrentSearch['iNamePhrase'] == $iPhrase)
{ {
$aSearch = $aCurrentSearch; $aSearch = $aCurrentSearch;
$aSearch['iSearchRank'] += 1; $aSearch['iSearchRank'] += 2;
$aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id']; if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch; $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
} $aSearch['iNamePhrase'] = $iPhrase;
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
if (!sizeof($aCurrentSearch['aName']) || $aCurrentSearch['iNamePhrase'] == $iPhrase) }
{
$aSearch = $aCurrentSearch;
$aSearch['iSearchRank'] += 2;
if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
$aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
$aSearch['iNamePhrase'] = $iPhrase;
if ($aSearch['iSearchRank'] < $iMaxRank) $aNewWordsetSearches[] = $aSearch;
}
} }
} }
} }