Score på MySQL-søgninger
Skal man søge i nogle store tekster i en MySQL-tabel kan man med fordel benytte sig af MySQL’s Full-Text søgninger. En funktion der er speciel anvendelig er dens mulighed for at rangordne efter hvor godt ens søgeord matcher det fundne. Jeg har lavet et lille eksempel:
Først lavede jeg en simpel tabel med et TEXT-felt med et FULLTEXT-index på:
1 2 3 4 5 6 | CREATE TABLE lipsum ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, str TEXT NOT NULL, PRIMARY KEY (id), FULLTEXT KEY str (str) ) ENGINE=MyISAM; |
Så hentede jeg en masse tekst fra lipsum.com og lagde det ind.
En søgning i tabellen kan se ud som følgende:
1 2 3 | SELECT * FROM lipsum WHERE MATCH (str) AGAINST ('tempus pede +lorem -ipsum' IN BOOLEAN MODE); |
Hvor jeg søger efter tekster der indeholder ‘tempus’ eller ‘pede’ og ‘lorem’ men uden ‘ipsum’. Da søgningen er lidt kompliceret vil jeg måske gerne ha’ en vægtning på, så de mest relevante resultater kommer først. Dette løser jeg på følgende måde:
1 2 3 4 5 | SELECT *, MATCH (str) AGAINST ('tempus pede +lorem -ipsum' IN BOOLEAN MODE) AS score FROM lipsum HAVING score > 0 ORDER BY score DESC; |
Hvor jeg først laver søgningen og kalder den ‘score’ og senere indskrænker min søgning med HAVING til kun at indeholde dem hvor score er højere end 0. Bemærk at man skal bruge HAVING og ikke WHERE.

Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.