Score på MySQL-søgninger

November 13, 2008 · Posted in Udvikling · Comment 

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.


  • Om websmed.dk

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

    Jeg vil her dele ud af min erfaring, og med jævne mellemrum poste nogle tips og tricks, samt løsningsforslag på generelle dagligdags problemstillinger.

    Jeg har en forkærlighed for PHP og MySQL, hvorfor I nok vil se flest indlæg der vedrører den gren af webudvikling.

    Jeg har en anden blog af mere personlig karakter på mbn.dk, hvor I kan finde kontaktmuligheder m.m.

    Mine indlæg vil tit være baseret på problemstillinger i mit daglige virke, eller i mit eget firma MRLYTICS, hvor jeg sælger kundeundersøgelser samt kundedatabaser.

    Denne side er hostet hos slicehost.

  • Skrevet på Twitter