Hvordan søke i MySQL-database?

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:

  1. CREATE TABLE table (
  2.   news_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3.   my_title VARCHAR(200),
  4.   my_text TEXT,
  5.   FULLTEXT (my_title, my_text)
  6. );

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:

  1. SELECT id, my_title,
  2.      MATCH(my_title, my_text)
  3.      AGAINST('elefant blåbær') as relevance
  4. FROM table
  5. WHERE
  6.      MATCH(my_title, my_text)
  7.      AGAINST('elefant blåbær')
  8. 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:

  1. SELECT id, my_title
  2. FROM table
  3. WHERE my_text LIKE ('%elefant%blåbær%')
  4. 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.

Det var det for denne gang gutter og muligens jenter, slik kan du søke i en MySQL database og sortere etter relevanse med MATCH.
Lykke til!

9 responser om “Hvordan søke i MySQL-database?”

  1. Flott med disse guidene her akkurat nå som jeg trenger dem! :) Har eget PHP/MySQL-programmeringsfag på IKT for tiden, så det er sikkert fler i klassen som kan få bruk for ting på bloggen din også.


  2. Flott å høre at noen drar nytte av det.

    Bare å komme med forslag om hva jeg skal skrive om, har lite emner for tiden, og skriver kun om det jeg ser folk driver med på NWF.


  3. Hvordan kan jeg med denne metoden bruke en søkestreng som denne: Lars Per "Arne Olav" -Lasse.


  4. Glem det det forige jeg "tenkte", manualen er en fin ting..
    http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html


  5. Hei!

    Du kan legge til IN BOOLEAN MODE i against funksjonen så har du løst det ja. Men du fant ut av det selv, så det er bra! :)


  6. Fin guide!
    La den til i artikkelsystemet mitt!
    http://danforum.net/

    Mvh. Dan


  7. Flott at du sier i fra.


  8. Hei,
    jeg holder på med et bilde/galleri-script hvor jeg ønsker å tagge bilden, men sliter med å søke i feltet. Er ordene for små (4 bokstaver ca) finner jeg dem ikke. Er det noen måte å endre på dette?


  9. Bruker du MATCH med IN BOOLEAN MODE, eller bruker du LIKE eller RLIKE?

    Beste måten å lage tags på er egentlig å ha en tabell med alle tagsene som blir lagd og så har du en ny tabell som binder poster til tags.


Legg igjen respons

Fyll ut alle felt markert med *

Brukerinformasjon
  1. Kan bruke følgende html: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> og [html] [css], [mysql] og [php] Hold posten ren og fin!

    Siter valgt tekst

E-post-varsel uten å skrive kommentar.

Info om posten

Innlegget ble postet 15.11.06 00:12 og ligger under kategorien PHP / MySQL. Du kan abonnere på kommentarene ved å bruke RSS 2.0 feed. Du kan legge til kommenter, eller trackback fra din blogg/side.

Resurser

Arkiver

Metainfo


Siste Flickr-bilder

  • Commentsystem (20070308)
  • Ukraina Aksjonen 2006 (20070306)
  • Mikael Brevik blogg (20070306)
  • Mikael Brevik (20070306)
  • Brukerdefinert side - AVIS2 (20070306)
  • Brevik Webutvikling (20070306)
  • skyscraper
  • visittkort