Fonetisch zoeken
Hallo allemaal,
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
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
Een beetje zoeken op Google doet al wonderen :)
http://tendena.wordpress.com/2010/10/18/mysql-phonetic-search/
en
http://www.inventis.be/blog/webdevelopment/3-weinig-gebruikte-mysql-functies/179/
http://tendena.wordpress.com/2010/10/18/mysql-phonetic-search/
en
http://www.inventis.be/blog/webdevelopment/3-weinig-gebruikte-mysql-functies/179/
Had ik nog niet van gehoord.
Zou dat deftig werken? Iemand ervaring mee?
Zou dat deftig werken? Iemand ervaring mee?
Heb er wel mee gewerkt. Werkt redelijk... als alles Engels is.
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
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
Hallo allemaal,
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:
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:
George, ik vind dit een heel interessant onderwerp. In 1987 heb ik voor het eerst kennis gemaakt met de soundex() functie op een cursus van Oracle versie 4. Sinds die tijd loop ik te verzinnen hoe je dat zou moeten gebruiken en nu, na 25 jaar, zie ik de practische toepassing dank zij jouw vraagstelling. Ik heb een stukje PHP geschreven:
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.
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
Het lijkt mij niet te lukken. Met bijgaande code geeft phpMyadmin een lege string terug
Je moet beide waarde soundexen dus ook de kolom die je vergelijkt maw:
Dan krijg ik:
en die werkt niet
Toevoeging op 18/10/2012 09:59:19:
Ik krijg nu bijna de gehele database op het scherm
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
Die had ik al hersteld. Bedankt!!
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......
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
Met deze regel krijg ik slechts één record te zien
En dat is wel of niet goed?
Staan er constant meerdere namen in de kolom voornamen?
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
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
Ik heb een oplossing gevonden: Omdat het van te voren niet bekend is welke velden de gebruiker gaat invullen, heb ik dus verschillende combinaties in queries vastgelegd. Je krijgt dan max 9 verschillende mogelijkheden met de combinatie SOUNDEX en LIKE. Dit werkt nu goed en de resultaten zijn verbluffend.
Dank voor het meedenken en de suggesties.
Dank voor het meedenken en de suggesties.
kan je een voorbeeldje geeven van je resultaat code mvg.
Joey,
Wat voor soort voorbeeld wil je? Een hyperlink of een voorbeeld van de output?
Toevoeging op 18/10/2012 12:02:22:
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
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
Ger,
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
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




