increase penalty for places without housenumber

Results where the housenumber was dropped are an unlikely result
when they refer to something other than a street. Therefore
increase their result rank so that other matches are tried first
before choosing them as a result.

Improves #2167.
This commit is contained in:
Sarah Hoffmann
2021-02-16 17:47:06 +01:00
parent 2a8e3741fa
commit 8eb85f1340
3 changed files with 15 additions and 4 deletions

View File

@@ -778,7 +778,7 @@ class Geocode
if (!empty($aResults)) { if (!empty($aResults)) {
$aSplitResults = Result::splitResults($aResults); $aSplitResults = Result::splitResults($aResults);
Debug::printVar('Split results', $aSplitResults); Debug::printVar('Split results', $aSplitResults);
if ($iGroupLoop <= 4 && empty($aSplitResults['tail']) if ($iGroupLoop <= 4
&& reset($aSplitResults['head'])->iResultRank > 0) { && reset($aSplitResults['head'])->iResultRank > 0) {
// Haven't found an exact match for the query yet. // Haven't found an exact match for the query yet.
// Therefore add result from the next group level. // Therefore add result from the next group level.
@@ -786,6 +786,10 @@ class Geocode
foreach ($aNextResults as $oRes) { foreach ($aNextResults as $oRes) {
$oRes->iResultRank--; $oRes->iResultRank--;
} }
foreach ($aSplitResults['tail'] as $oRes) {
$oRes->iResultRank--;
$aNextResults[$oRes->iId] = $oRes;
}
$aResults = array(); $aResults = array();
} else { } else {
$aResults = $aSplitResults['head']; $aResults = $aSplitResults['head'];

View File

@@ -26,6 +26,8 @@ class Result
public $iExactMatches = 0; public $iExactMatches = 0;
/// Subranking within the results (the higher the worse). /// Subranking within the results (the higher the worse).
public $iResultRank = 0; public $iResultRank = 0;
/// Address rank of the result.
public $iAddressRank;
public function debugInfo() public function debugInfo()
{ {
@@ -84,7 +86,7 @@ class Result
foreach ($aResults as $oRes) { foreach ($aResults as $oRes) {
if ($oRes->iResultRank < $iMinRank) { if ($oRes->iResultRank < $iMinRank) {
$aTail = array_merge($aTail, $aHead); $aTail += $aHead;
$aHead = array($oRes->iId => $oRes); $aHead = array($oRes->iId => $oRes);
$iMinRank = $oRes->iResultRank; $iMinRank = $oRes->iResultRank;
} elseif ($oRes->iResultRank == $iMinRank) { } elseif ($oRes->iResultRank == $iMinRank) {

View File

@@ -450,7 +450,11 @@ class SearchDescription
// Downgrade the rank of the street results, they are missing // Downgrade the rank of the street results, they are missing
// the housenumber. // the housenumber.
foreach ($aResults as $oRes) { foreach ($aResults as $oRes) {
$oRes->iResultRank++; if ($oRes->iAddressRank >= 26) {
$oRes->iResultRank++;
} else {
$oRes->iResultRank += 2;
}
} }
$aHnResults = $this->queryHouseNumber($oDB, $aResults); $aHnResults = $this->queryHouseNumber($oDB, $aResults);
@@ -715,7 +719,7 @@ class SearchDescription
$aResults = array(); $aResults = array();
if (!empty($aTerms)) { if (!empty($aTerms)) {
$sSQL = 'SELECT place_id,'.$sExactMatchSQL; $sSQL = 'SELECT place_id, address_rank,'.$sExactMatchSQL;
$sSQL .= ' FROM search_name'; $sSQL .= ' FROM search_name';
$sSQL .= ' WHERE '.join(' and ', $aTerms); $sSQL .= ' WHERE '.join(' and ', $aTerms);
$sSQL .= ' ORDER BY '.join(', ', $aOrder); $sSQL .= ' ORDER BY '.join(', ', $aOrder);
@@ -728,6 +732,7 @@ class SearchDescription
foreach ($aDBResults as $aResult) { foreach ($aDBResults as $aResult) {
$oResult = new Result($aResult['place_id']); $oResult = new Result($aResult['place_id']);
$oResult->iExactMatches = $aResult['exactmatch']; $oResult->iExactMatches = $aResult['exactmatch'];
$oResult->iAddressRank = $aResult['address_rank'];
$aResults[$aResult['place_id']] = $oResult; $aResults[$aResult['place_id']] = $oResult;
} }
} }