Gå til innhold

"search-query" i mySQL etter flere ord


Anbefalte innlegg

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 :roll:

Lenke til kommentar
Videoannonse
Annonse

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

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:

 

SQL-search1.gif

 

 

...og:

 

 

SQL-search2.gif

 

 

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 :hmm:

Lenke til kommentar

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

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? :hmm:

Endret av simenss
Lenke til kommentar

Ah! Ingenting å være skeptisk over... :p 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 :yes:

 

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...