Effektiv søgefunktion med Full Text indeks i MySQL
Selvom det de sidste år er meget populært at bruge dedikerede søgeindex som Sphinx og Lucene, så kan disse systemer i bund og grund mere, end hvad de fleste har behov for eller har til rådighed. Dedikerede søgeindex kræver som regel, at de kan køre som en egen service på serveren. Det tilbyder de færreste webhoteller.
At lave en fornuftig søgefunktion med MySQL-databasen er slet ikke så svært, og det er heller ikke så ineffektivt, som man nemt kan foranlediges til at tro. Det dækker til fulde behovet for små og mellemstore websider. Til for eksempel en blog (uanset størrelse) er MySQL rigeligt, men de dedikerede indekseringstjenester har rigtignok ekstra funktioner som facetter, markering af søgeord og relevans, som man enten må undvære eller implementere selv.
Denne guide retter sig mod de, der bruger MySQL til database for mindre og mellemstore websider, hvor man har brug for en form for søgefunktion.
Opret indeks på tabellen
MySQL har en funktion, der hedder Full-Text indeksering på tabeller. Det er kort fortalt et indbygget indeks i MySQL, som opdateres hver gang man kører en INSERT eller UPDATE på en tabel. Så søger databasen i indekset istedet for i selve tabellen, og søgningen vil gå hurtigere.
Det første vi derfor skal gøre er at oprette indekset på tabellen i MySQL. Det kræver, at vi først bestemmer os for, hvilke felter i tabellen, der skal kunne søges i. For eksempel har man gerne to felter, man har lyst til at gøre søgbare: overskrift og indhold. Disse skal vi oprette et fælles indeks over. Det gøres med denne kommando:
CREATE FULLTEXT INDEX mit_index ON min_tabel (felt_a, felt_b, felt_c);
Husk at skrive navnene på din tabel og de felter, som skal indekseres. Du kan selvfølgelig også kalde indekset noget andet end ‘mit_indeks’.
Søg i indekset
Søgningen i tabellen benytter MySQLs MATCH-AGAINST kommando i WHERE-delen af SQL-kommandoen. Kommandoen ser således ud:
SELECT * FROM min_tabel WHERE MATCH(felt_a, felt_b, felt_c) AGAINST('søgeord');
Her er det vigtigt at huske på, at felterne i MATCH-kommandoen skal være de samme, som du brugte i indekset, som vi lige har oprettet.
Dette er stort set alt du behøver, for at lave en udmærket søgefunktion med MySQL – med andre ord værktøjer, der allerede er tilgængelige på dit eget webhotel.
Hvis du selv vil udforske videre indenfor Full Text indeksering, så start med dokumentationen. Læs videre for en kort introduktion til nogle ekstra features.
Mere avancerede søgeformer
Det er muligt at udvide funktionaliteten lidt. AGAINST-kommandoen kan tage et ekstra parameter, der fortæller MySQL, hvordan den skal søge i indekset. Her kan man bruge mere eksotiske funktioner som binær søgning og søgning med naturligt sprog. Det følgende er kun en enkel introduktion – den dybere forståelse må du selv sørge for ved at læse dokumentationen eller søge på nettet.
Binært søg
Binært søg vil sige, at man kan bruge plus og minus foran ord i sit søgeudtryk for at fortælle databasen, hvilke ord der skal stå i teksten, og hvilke der ikke må stå i teksten. Et eksempel kunne være et søgeudtryk som ‘mobiltelefon -android’ som vil returnere de rækker, som nævner mobiltelefon men ikke android.
Query expansion
Query expansion er en mere ‘intelligent’ (i mangel af bedre ord) form for søgning, men den kan desværre også let give en masse irrelevante søgeresultater. I korte træk fungerer det sådan, at databasen kan udlede andre søgeudtryk ud fra det man faktisk har søgt efter. Med udgangspunkt i eksemplet ovenfor, så kan en søgning efter ‘mobiltelefon’ også give resultater, hvor kun ‘android’ forekommer, fordi databasen kan se, at ‘android’ ofte optræder i sammenhæng med ‘mobiltelefon’.
Ifølge dokumentationen virker dette bedst, når man bruger (meget) korte søgeord.
Natural language mode
For at være helt ærlig, så kan jeg ikke finde et entydigt svar på, hvad natural language mode egentlig er. Det ser ud til, at denne funktion også giver en score til rangering af resultaterne efter relevans. Desuden kan man antage, at navnet betyder, at funktionen er bedre til at håndtere søgninger, hvor man bruger mere naturligt sprog. Natural language mode blev først introduceret i MySQL 5.5.
18
dec
