Fulltext search
Voor het zoeken naar producten op mijn site gebruik ik fulltext search.
Daarbij heb ik 1 probleempje.
Ik heb deze code: +ZOEKVELD*
Als deze waarde in de database staat: abcdefghij
en ik zoek op abcd dan wordt het resultaat gevonden
als ik zoek op bcdef dan vindt hij niets. Hoe kan ik ervoor zorgen dat ik ook het eerste deel van het woord kan weglaten en het toch vindt?
Ik heb dit geprobeerd +*ZOEKVELD* maar ook dat werkt niet
Bedankt alvast!
Dan zal je like moeten gebruiken, met match against kan je alleen zoeken op woorden of woorden beginnende met.
Ik heb bijvoorbeeld 2 kolommen: Merk & Type
Merk is bijvoorbeeld Tamiya
Type is: King hauler full option
Als ik nu zoek naar Tamiya hauler, dan heb ik resultaat
Met Like niet...
Fulltext werkt precies naar behoren, alleen jammer als ik amiya intype dat hij dan niets vindt.
Is er geen omweg om dit wel voor elkaar te krijgen?
Gewijzigd op 20/07/2013 10:14:52 door Shamrock Modelbouw
Overigens, dit lijkt erg omslachtig, maar bedenk dat een fulltext dit in feite ook doet, alleen dan wel naar zo'n beetje alle woorden kijkt. Jij kan zelf de belangrijkste woorden selecteren, waardoor je woordentabel veel kleiner kan worden en dus veel sneller.
Als dit in de tabel staat:
Tamiya King Hauler Full Option
en ik zoek op Tamiya hauler option full dan vindt hij niets, dat is nu wel met fulltext search
Mijn eerste stukje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
// kijk eerst even of alles binnen gekomen is
if(isset($_POST['q']) AND !empty($_POST['q']))
{
// eerst makkelijk maken
$q = strtolower($_POST['q']);
}
else
{
$q = '';
$html[] = 'Er is geen zoekopdracht ontvangen';
$html[] = zoekformulier();
}
// bewerk zoekwoorden
$verwijder = explode(',', "zundapp,de,aan,af,al,als,bij,dan,dat,die,dit,een,en,er,had,heb,hem,het,hij,hoe,hun,ik,in,is,je,kan,me,men,met,mij,nog,nu,of,ons,ook,te,tot,uit,van,was,wat,we,wel,wij,zal,ze,zei,zij,zo,zou");
$q = str_replace(' '.$verwijder.' ', ' ', $q);
// de zoekfunctie in woorden hakken en direct in een array zetten
$q_array = explode(" ", $q);
$sql_against = array();
// voor elk woord het volgende maken
foreach($q_array as $woord)
{
$woord = mysqli_real_escape_string($mysqli, strtolower($woord));
$sql_against[] = " titel LIKE '%" . $woord . "%'
OR korte_omschrijving LIKE '%" . $woord . "%'
OR inhoud LIKE '%" . $woord . "%'";
}
$res = sql("
SELECT id, titel, korte_omschrijving
FROM artikelen
WHERE " . implode(" OR ", $sql_against) . "
ORDER BY id DESC ");
?>
// kijk eerst even of alles binnen gekomen is
if(isset($_POST['q']) AND !empty($_POST['q']))
{
// eerst makkelijk maken
$q = strtolower($_POST['q']);
}
else
{
$q = '';
$html[] = 'Er is geen zoekopdracht ontvangen';
$html[] = zoekformulier();
}
// bewerk zoekwoorden
$verwijder = explode(',', "zundapp,de,aan,af,al,als,bij,dan,dat,die,dit,een,en,er,had,heb,hem,het,hij,hoe,hun,ik,in,is,je,kan,me,men,met,mij,nog,nu,of,ons,ook,te,tot,uit,van,was,wat,we,wel,wij,zal,ze,zei,zij,zo,zou");
$q = str_replace(' '.$verwijder.' ', ' ', $q);
// de zoekfunctie in woorden hakken en direct in een array zetten
$q_array = explode(" ", $q);
$sql_against = array();
// voor elk woord het volgende maken
foreach($q_array as $woord)
{
$woord = mysqli_real_escape_string($mysqli, strtolower($woord));
$sql_against[] = " titel LIKE '%" . $woord . "%'
OR korte_omschrijving LIKE '%" . $woord . "%'
OR inhoud LIKE '%" . $woord . "%'";
}
$res = sql("
SELECT id, titel, korte_omschrijving
FROM artikelen
WHERE " . implode(" OR ", $sql_against) . "
ORDER BY id DESC ");
?>
Gewijzigd op 20/07/2013 12:06:45 door Eddy E
Bedankt, hier zat ik inderdaad zelf ook al aan te denken, zal dit idee eens toepassen in het zoekscript!
Alleen hoop ik voor jou (en ook voor Eddy), dat de tabel waarin je zoekt niet al te veel records bevat, want LIKE '%woord%' kan een query ontzettend traag maken.
Gaat nu om ongeveer 10000 records
Optie 1 om te versnellen, de wildcard aan het begin weglaten (wat dus betekent dat je niet meer op 'amiya' kunt zoeken als je 'tamiya' wilt vinden).
Optie 2 om te versnellen, je keywords waarop jij denkt dat gezocht kan worden eruit halen, in een aparte tabel stoppen, producten linken en daarop zoeken (zoals ik in een eerdere post al aangaf). Dat geeft je ook de mogelijkheid om verbasterde woorden op te nemen. Bijvoorbeeld 'amiya', 'tamiy' en zelfs 'temiya' voor mensen die het verkeerd spellen. Hoef je geen LIKE te gebruiken en kan je dus volledige indexen gebruiken.
Andere optie is om sphinx te installeren.
denk dat ik dit voor nu ga gebruiken...
wat houd sphinx in?
Op hoeveel woorden zoek je?
verschillend, van 1 letter tot 2 of 3 woorden
http://sphinxsearch.com/docs/current.html
Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.
Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.
Bart V B op 20/07/2013 14:04:13:
http://sphinxsearch.com/docs/current.html
Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.
Heb je ook een explain query gedaan?
Want dan weet je hoe lang hij er over doet en wat hij aanspreekt.
zal eens kijken hoe dat werkt met die explain query. Dat sphinx had ik al opgezocht en lijkt interessant, hier in de toekomst eens naar kijken
Voor dat je select doet zet je er explain voor. ;-)
Nu is mijn sql wat stroefjes om het goed uit te leggen, maar waar het op neer komt is dat je een index moet aanmaken.
Dat is een stukje wat er voor zorgt dat hi je niet de hele database hoeft te raadplegen. Maar dat hij uit dat stukje de juiste gegevens ophaalt.
Nb let wel op dat optimaliseren gedaan dient te worden als je een probleem hebt.
Niet als je geen performance probleem hebt.
bedankt voor de hulp!
En wat betreft de tijd die de query duurt zoe ik zoektermen testen die steeds langer worden, in elk geval tot zo'n 10 woorden. Dan kan je zien of het nog steeds snel genoeg is voor je.