May 04

Topp notis: FULLTEXT-metoden som er brukt i denne artikkelen støttes ikke av database-typen InnoDB, men MyISAM.

Det er flere metoder du kan bruke når du skal søke i en MySQL database. De vanligste metodene er å bruke LIKE() eller MATCH(). Her vil jeg forklare en bruk av MATCH, og så vidt nevne LIKE/RLIKE. MATCH bruker vi i noe som kalles FULLTEXT search. Det betyr at du må ha en FULLTEXT-index i tabellen din.

Dette kan du gjøre eks via CREATE eller ALTER. Når du lager en ny tabell kan du f.eks gjøre slik:

CREATE TABLE table (
   news_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   my_title VARCHAR(200),
   my_text TEXT,
   FULLTEXT (my_title, my_text)
);

FULLTEXT skal asignes til de feltene som du vil MATCH skal fungere på.

Så hvordan søker vi?

Si at jeg har mye innhold i tabellen ovenfor som handler om elefanter og blåbær.

Så skal jeg plukke ut de artiklene som inneholder nettopp ordene “elefant” og “blåbær”. Da gjør jeg slik:

SELECT id, my_title,
   MATCH(my_title, my_text)
   AGAINST('elefant blåbær') as relevance
FROM table
  WHERE
     MATCH(my_title, my_text)
     AGAINST('elefant blåbær')
ORDER BY relevance DESC

Her rekner du ut rel som relevanse over hvor mye det stemmer, og vi sorterer etter mest relevante søk, fra størst til minst. Vi velger ut ID, tittel og relevanse.

Det blir ingen videre utgreing av dette, det er selvforklarende.

Kjapt om LIKE()

Her kommer det også litt kjapt om hvordan du kan bruke LIKE. Her er det essensielt med wildcardet % for å matche mot resultat.

Her er det korrekt med eksempelet ovenfor:

SELECT id, my_title
FROM table
WHERE my_text LIKE ('%elefant%blåbær%')
AND my_text RLIKE '[[:< :]]elefant[[:>:]].*[[:< :]]blåbær[[:>:]]'

… Eventuelt utvide med å søke i my_title også!

Redigert – 06.07.07 02:38:

Ser jeg har mangel på forklaring av hva RLIKE gjør, som kan forvirre litt. RLIKE fungerer på samme måte som LIKE gjør, bare at det er med regulære uttrykk. På den måten får du mye større muligheter til hva du skal hente ut, og ikke bare benytte deg av wildcard.

\\ tags: , , , , , , ,

Legg igjen en kommentar