Fonetisch zoeken
Ik ben op zoek naar de mogelijkheid om fonetisch te zoeken in mijn database. Is dat met behulp van SQL mogelijk?
Bijv.: Bij het zoeken naar Baasbank moeten o.m. ook de volgende namen getoond worden:
Baasbank
Baesbank
Baesbancq
Baaszbank
enz.
Weet iemand of en hoe dat mogelijk is? (Ideale optie voor genealogen)
George
http://tendena.wordpress.com/2010/10/18/mysql-phonetic-search/
en
http://www.inventis.be/blog/webdevelopment/3-weinig-gebruikte-mysql-functies/179/
Zou dat deftig werken? Iemand ervaring mee?
Voor Nederlands werkt het dus wel, maar pakt soms totaal verkeerd uit.
Trouwens: PHP heeft ook deze soundex-functie: http://php.net/manual/en/function.soundex.php
Ik heb ff de sites bezocht maar kom voorlopig tot de conclusie dat het, voor mij, in het NL maar matig werkt. Of eigenlijk helemaal niet goed. Als ik Baasbank in type krijg ik slects één Baesbanck te zien. Zelfs de goed geschreven namen komen niet in de lijst voor.
Ik heb de volgende code toegepast:
Code (php)
En als ik dat uitvoer dan komt er het volgende uit:
Dit lijkt me bemoedigend voor jouw onderzoek, George! Je wilde dat al je genoemde schrijfwijzen tot dezelfde uitspraak formule zouden worden herleid, en dat gebeurt dus ook met de PHP soundex() functie.
Ik hoop dat je daar wat mee kunt.
Werkt het niet bevredigend dan ligt er natuurlijk de mogelijkheid open om zelf een Nederlandse versie van soundex() te maken. Dat lijkt me niet zo heel moeilijk.
Gewijzigd op 17/10/2012 20:54:25 door Ivo Breeden
Code (php)
1
$sql = "SELECT * FROM ove_genalogie WHERE SOUNDEX(voornamen) = SOUNDEX('$cVoornaam') OR SOUNDEX(tussenvoeg) = SOUNDEX('$cTussenvoeg') OR SOUNDEX(achternaam) = SOUNDEX('$cFamilienaam')";
en die werkt niet
Toevoeging op 18/10/2012 09:59:19:
Ik krijg nu bijna de gehele database op het scherm
spelfout: ove_genalogie => ove_genealogie
Toevoeging op 18/10/2012 10:05:23:
Het "probleem"zit nu in de selectie. Bij gebruik van soundex op alleen het veld "achternaam" gaat goed, in combinatie met de voornaam danwel de tussenvoeg loopt het fout......
George van Baasbank op 18/10/2012 09:56:51:
Ik krijg nu bijna de gehele database op het scherm
Hetgeen toch wel logisch is, in het Nederlands zou je dit doen
Geef mij de personen waarvan de voornaam klinkt als 'Jan' of waarvan de achternaam klinkt als 'Jansen'
de OR's moeten dus AND's worden
En dat is wel of niet goed?
En kijk eens gewoon met een SOUNDEX(kolom) in de SELECT wat voor resultaten je daaruit krijgt.
Cees of Kees, is namelijk niet hetzelfde en Jan of Jan_Pieter helemaal al niet
Dank voor het meedenken en de suggesties.
kan je een voorbeeldje geeven van je resultaat code mvg.
Wat voor soort voorbeeld wil je? Een hyperlink of een voorbeeld van de output?
Toevoeging op 18/10/2012 12:02:22:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Alleen de familienaam is ingevuld
$cVoornaam = "%" . $cVoornaam . "%";
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(achternaam) = SOUNDEX('$cFamilienaam') AND tussenvoeg LIKE '$cTussenvoeg' AND voornamen LIKE '$cVoornaam' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} elseif($cFamilienaam != "" AND $cVoornaam != "" AND $cTussenvoeg == "") {
// Alleen de familienaam en voornamen zijn ingevuld
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(achternaam) = SOUNDEX('$cFamilienaam') AND tussenvoeg LIKE '$cTussenvoeg' AND SOUNDEX(voornamen) = SOUNDEX('$cVoornaam') ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} elseif($cVoornaam != "" AND $cTussenvoeg == "" AND $cFamilienaam == "") {
// Alleen de voornaam is ingevuld
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$cFamilienaam = "%" . $cFamilienaam . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(voornamen) = SOUNDEX('$cVoornaam') AND tussenvoeg LIKE '$cTussenvoeg' AND achternaam LIKE '$cFamilienaam' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} else {
$cVoornaam = "%" . $cVoornaam . "%";
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$cFamilienaam = "%" . $cFamilienaam . "%";
$sql = "SELECT * FROM ove_genealogie WHERE voornamen = LIKE '$cVoornaam' AND achternaam LIKE '$cFamilienaam' AND tussenvoeg LIKE '$cTussenvoeg' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC";
}
$cVoornaam = "%" . $cVoornaam . "%";
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(achternaam) = SOUNDEX('$cFamilienaam') AND tussenvoeg LIKE '$cTussenvoeg' AND voornamen LIKE '$cVoornaam' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} elseif($cFamilienaam != "" AND $cVoornaam != "" AND $cTussenvoeg == "") {
// Alleen de familienaam en voornamen zijn ingevuld
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(achternaam) = SOUNDEX('$cFamilienaam') AND tussenvoeg LIKE '$cTussenvoeg' AND SOUNDEX(voornamen) = SOUNDEX('$cVoornaam') ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} elseif($cVoornaam != "" AND $cTussenvoeg == "" AND $cFamilienaam == "") {
// Alleen de voornaam is ingevuld
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$cFamilienaam = "%" . $cFamilienaam . "%";
$sql = "SELECT * FROM ove_genealogie WHERE SOUNDEX(voornamen) = SOUNDEX('$cVoornaam') AND tussenvoeg LIKE '$cTussenvoeg' AND achternaam LIKE '$cFamilienaam' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC ";
} else {
$cVoornaam = "%" . $cVoornaam . "%";
$cTussenvoeg = "%" . $cTussenvoeg . "%";
$cFamilienaam = "%" . $cFamilienaam . "%";
$sql = "SELECT * FROM ove_genealogie WHERE voornamen = LIKE '$cVoornaam' AND achternaam LIKE '$cFamilienaam' AND tussenvoeg LIKE '$cTussenvoeg' ORDER BY achternaam ASC, voornamen ASC, g_sortdatum ASC";
}
Toevoeging op 18/10/2012 12:05:51:
Ik heb de pagina even tijdelijk publiek toegankelijk gemaakt: http://ov.vanbaasbank.nl/bibliotheek.php
Zoek eens op de voornaam Gerrit en kijk in de lijst welke namen er langs komen. Ook het zoeken op Hans geeft leuke resultaten
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$wheres = array();
if ($cVoornaam != '') $wheres['voornamen'] = $cVoornaam;
if ($cAchternaam != '') $wheres['achternaam'] = $cAchternaam;
if ($cTussenvoeg != '') $wheres['tussenvoeg'] = $cTussenvoeg;
$sql = "SELECT CONCAT(voornamen, ' ',
LTRIM(CONCAT(tussenvoeg, ' ', achternaam))
) AS fullname
FROM ove_genealogie
WHERE
";
$and ='';
foreach ($wheres as $field => $value) {
$sql .= $and . "SOUNDEX(" . $field . ") = SOUNDEX('" . $value . "')";
$and = ' AND ';
?>
$wheres = array();
if ($cVoornaam != '') $wheres['voornamen'] = $cVoornaam;
if ($cAchternaam != '') $wheres['achternaam'] = $cAchternaam;
if ($cTussenvoeg != '') $wheres['tussenvoeg'] = $cTussenvoeg;
$sql = "SELECT CONCAT(voornamen, ' ',
LTRIM(CONCAT(tussenvoeg, ' ', achternaam))
) AS fullname
FROM ove_genealogie
WHERE
";
$and ='';
foreach ($wheres as $field => $value) {
$sql .= $and . "SOUNDEX(" . $field . ") = SOUNDEX('" . $value . "')";
$and = ' AND ';
?>
Niet alleen is de code korter, maar wordt de SQL netter, want als een kolom alles (LIKE '%%') mag bevatten kan je hem beter uit de filter weghalen
Gewijzigd op 18/10/2012 12:54:48 door Ger van Steenderen
Ik weet het: Jij levert altijd hoge-school SQL af die goed werkt. Ook deze zal perfect werken. Ik ga eerst proberen uit te vinden wat je precies en waarom doet zodat ik het later nogmaals kan gebruiken maar vooral kan onderhouden.
De SELECT CONCAT zal wel wat nadere studie behoeven.
Alvast bedankt!!
George