simenss Skrevet 24. september 2005 Del Skrevet 24. september 2005 Hei, Jeg har en database med bilder som jeg vil la mine bruke søke gjennom. Slik jeg har det nå bruker jeg denne spørringen: mysql_query("SELECT * FROM images WHERE search REGEXP '".$_GET['k']."' AND display='all' AND kategori!='SLETTET' OR search REGEXP '".$_GET['k']."' AND search REGEXP '".$_GET['k']."' AND display='".$array['Display']."' ORDER BY dato DESC LIMIT ".$start.", ".$per_side); $_GET['k'] variablen er hele teksten brukeren har fylt inn i skjemaet. Det kan være et eller flere ord. Men si at jeg har et bilde av James Bond i databasen der søkeordene til bildet (search) er 'james,bond,007'. Hvis brukeren søker etter "james bond" vil ikke mySQL-spørringen gi noe resultat. Men hvis brukeren kun søker etter "james" vil spørringen gi resultat. Hva er det beste måten for å få spørringen til å se etter om hver av ordene finnes blandt søkeordene til bildet (search)? Mulig spørsmålet er litt dårlig formulert Lenke til kommentar
stiber Skrevet 24. september 2005 Del Skrevet 24. september 2005 Les om fulltext-søk her og boolske fulltext-søk her, hvis du har MySQL 4.0.1 eller senere. Forkortet eksempel: $search = mysql_real_escape_string($_GET['k']); mysql_query("SELECT * FROM images WHERE MATCH(search) AGAINST('$search') ORDER BY dato DESC); Her vil bilder som har best match med søkeordene komme først. $search = mysql_real_escape_string($_GET['k']); mysql_query("SELECT *, MATCH(search) AGAINST ('$search') AS score FROM images WHERE MATCH(search) AGAINST('$search') ORDER BY score DESC); NB: For at dette skal virke må du ha fulltext index på search kolonnen. (Dette hører vel mer hjemme i database kategorien...) Lenke til kommentar
simenss Skrevet 24. september 2005 Forfatter Del Skrevet 24. september 2005 Takker ed Lenke til kommentar
simenss Skrevet 24. september 2005 Forfatter Del Skrevet 24. september 2005 Jeg prøver følgende: $search = mysql_real_escape_string($_GET['k']); SELECT * FROM images WHERE MATCH(search) AGAINST('$search') ORDER BY dato DESC Men den finner ingen resultater. Her er noen bilder fra phpMyAdmin: ...og: Jeg har også prøvd dirkete i phpMyAdmin med disse spørringene: SELECT * FROM images WHERE MATCH(search) AGAINST('a') ORDER BY dato DESC SELECT * FROM images WHERE MATCH(search) AGAINST('a b') ORDER BY dato DESC SELECT * FROM images WHERE MATCH(search) AGAINST('b') ORDER BY dato DESC Men ingen gir noe resultat Lenke til kommentar
stiber Skrevet 24. september 2005 Del Skrevet 24. september 2005 Det finnes en variabel som settes i oppstart av mysql som heter "ft min word len" som bestemmer minimum lengde på ord som skal indekseres. Denne er default satt til 4. Dette kan være ett av problemene dine. Jeg bruker å sette denne til 3, ettersom det er altfor mange norske ord som blir ekskludert med begrensning på fire tegn. Ved endring av denne variablelen, eller andre fulltext relaterte variabler, må du kjøre en repair på tabellen. REPAIR TABLE tbl_name QUICK; Mer info her. Lenke til kommentar
simenss Skrevet 24. september 2005 Forfatter Del Skrevet 24. september 2005 (endret) Er det noe spesielt jeg bør vite om når det gjelder dette? Blir alltid litt skeptisk når jeg blir bedt om å endre innstillinger jeg ikke har vært borti før Men hvis jeg setter denne ft min word len til 3, betyr det at søkeordet må være på minst 3 tegn? EDIT: Hvor får jeg egentlig endret denne ft min word len variablen? Endret 24. september 2005 av simenss Lenke til kommentar
stiber Skrevet 25. september 2005 Del Skrevet 25. september 2005 Ah! Ingenting å være skeptisk over... I alle fall, her er noen tips om hvor du finner konfigurasjonsfilene. Windows: x:\windir\my.ini x:\mysqldir\my.ini Linux: /etc/my.cnf /mysqldir/my.cnf #Finn igjen: [mysqld] #og føy til dette under: ft_min_word_len=3 #og hvis du finner en slik linje: [myisamchk] #Så sett inn tilsvarende under her også: ft_min_word_len=3 Dette trenger du bare å gjøre hvis du ønsker å kunne søke på ord som er minst 3 tegn, mot default 4. Det er ingenting som stopper deg i å sette denne enda lavere, men jeg ser ikke det helt store poenget i det. Nå kan man plutselig søke på ord som: rød, blå, hus, bil, fly, båt, tog, ulv, pus, mus, grå, hår osv... hurra Andre ting du bør vite. Logikken bak fulltext søk er slik at den forkaster alle søkeord som er mindre enn denne variabelen, eller større enn ft_max_word_len, som default er 84 tror jeg. Den vil også forkaste ord som er brukt i mer enn 50% av radene i tabellen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå