This commit is contained in:
2026-01-03 01:38:59 +01:00
parent d930a31978
commit a55061bdfa

View File

@@ -26,13 +26,21 @@ final class Search
foreach ($tokens as $tok) { foreach ($tokens as $tok) {
$tok = trim($tok); $tok = trim($tok);
if ($tok === '') continue; if ($tok === '') continue;
$conditions[] = "(title LIKE CONCAT('%', ?, '%') OR teaser_public LIKE CONCAT('%', ?, '%') OR description LIKE CONCAT('%', ?, '%') OR city LIKE CONCAT('%', ?, '%') OR region LIKE CONCAT('%', ?, '%') OR zip LIKE CONCAT('%', ?, '%'))"; // LIKE + phonetic (SOUNDEX) to allow partial and typo-tolerant matches
$conditions[] = "(title LIKE CONCAT('%', ?, '%') OR teaser_public LIKE CONCAT('%', ?, '%') OR description LIKE CONCAT('%', ?, '%') OR city LIKE CONCAT('%', ?, '%') OR region LIKE CONCAT('%', ?, '%') OR zip LIKE CONCAT('%', ?, '%') OR SOUNDEX(title)=SOUNDEX(?) OR SOUNDEX(teaser_public)=SOUNDEX(?) OR SOUNDEX(description)=SOUNDEX(?) OR SOUNDEX(city)=SOUNDEX(?) OR SOUNDEX(region)=SOUNDEX(?))";
// LIKE bindings
$bindTokens[] = $tok; $bindTokens[] = $tok;
$bindTokens[] = $tok; $bindTokens[] = $tok;
$bindTokens[] = $tok; $bindTokens[] = $tok;
$bindTokens[] = $tok; $bindTokens[] = $tok;
$bindTokens[] = $tok; $bindTokens[] = $tok;
$bindTokens[] = $tok; $bindTokens[] = $tok;
// SOUNDEX bindings
$bindTokens[] = $tok;
$bindTokens[] = $tok;
$bindTokens[] = $tok;
$bindTokens[] = $tok;
$bindTokens[] = $tok;
$i++; $i++;
} }
@@ -41,7 +49,8 @@ final class Search
"status != 'cancelled'", "status != 'cancelled'",
]; ];
if ($conditions) { if ($conditions) {
$whereParts[] = implode(' AND ', $conditions); // "OR" so that partial matches across tokens are allowed
$whereParts[] = '(' . implode(' OR ', $conditions) . ')';
} }
$distanceFiltering = false; $distanceFiltering = false;
@@ -76,7 +85,7 @@ final class Search
// Radius for HAVING // Radius for HAVING
$bind[] = $radius; $bind[] = $radius;
} else { } else {
$sql = "SELECT id, title, teaser_public, description, city, region, zip, starts_at, visibility, allow_kids, location_label, lat, lng, 30 AS distance_km"; $sql = "SELECT id, title, teaser_public, description, city, region, zip, starts_at, visibility, allow_kids, location_label, lat, lng, 1 AS distance_km";
$bind = $bindTokens; $bind = $bindTokens;
} }