fiskeben.dk


Meninger med mening

Arkiv for Nørderi

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

0

TermKit

En fyr ved navn Steven Wittens vil gøre op med de gammeldagse UNIX terminaler og bringe dem ind i 2011 med sit projekt, TermKit.

It’s 2011, and monospace text just doesn’t cut it anymore. In the default ANSI color palette, barely any of the possible color combinations are even readable. We can’t display graphs, mathematical formulas, tables, etc. We can’t use the principles of modern typography to lay out information in a readable, balanced way.

At lave et grafisk alternativ til kommandolinjen har været forsøgt mange gange før, men der er en grund til, at de knapt nok slår igennem hos nybegyndere, der får koldsved ved tanken om terminaler: fleksibilitet og fart.

Alligevel synes jeg, at TermKit fortjener opmærksomhed. Det lader til at være gennemtænkt, og at fyren ved hvad han snakker om.

19

maj

0

6 andre måder at bruge App Switcher på

De fleste kender til cmd + tab for at skifte mellem programmer i Mac OSX, men funktionen har faktisk en del skjulte features. Seks, for at være nøjagtig.

Min favorit er denne:

There’s no need to move to every program and quit each individually. Press Command-Tab for the Application Switcher and then, keeping Command down, press and hold Q. Each application quits in turn; you’ll be notified if there are any unsaved changes in documents.

Læs de andre fem tips på Macworld.com

18

maj

1

Lego iPad stand

Da jeg var i London i forrige uge købte jeg en iPad, selvom jeg ikke ved hvad jeg skal bruge den til. Jeg er glad for den alligevel (mere om det i et andet indlæg, engang). Så glad, at jeg besluttede mig for at bygge en holder til den – i Lego, naturligvis. Læs resten »

12

sep

4