fiskeben.dk


Meninger med mening

Indlæg mærket med MySQL

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

Nem webudvikling på Mac med MAMP

Der er mange måder at drive webudvikling på, men når det kommer til server side scriptsprog som PHP, så er det meget nyttigt med en form for server, man kan teste sine tricks på. Nogle foretrækker at redigere filerne direkte på serveren over FTP, andre bruger en lokal server. Jeg har netop opdaget glæden ved MAMP, der er en gratis Mac-pendant til det såkaldte LAMP setup. LAMP står for Linux Apache MySQL PHP og er vidt udbredt. Med MAMP (som naturligvis står for Mac Apache MySQL PHP) får man adgang til et enkelt setup på sin lokale maskine. Jeg vil her gennemgå lidt om opsætningen og også vise dig, hvordan du kan aktivere mere avancerede funktioner, som du ellers er nødt til at købe pro-versionen for at kunne bruge.

Læs resten »

30

nov

0

Store flyttedag

Da min gamle serverudbyder-dims har opgivet ævred af økonomiske årsager, var jeg nødt til at finde mig en ny, og den har jeg så fundet. Derfor har jeg i dag holdt store flyttedag, og enkelte har muligvis oplevet, at siden her har været lidt sær (altså – mere sær end ellers). Nu skulle alt være tilbage til sit oprindelige særheds-niveau efter lidt slåssen med DNS og altid i forbindelse med serverbytte tilbagevendende Store MySQL-idioti, nemlig tegnsæt. Hurra for MySQL, der er en belortet database, men heldigvis lærer man da efterhånden at kende dens irriterende quirks og løsningen derpå.

27

okt

0

WordPress here I come!

Endelig fik jeg nosset mig sammen til at konvertere min gamle hjemmeside over til WordPress [edit: jeg skal selvfølgelig linke til den DANSKE WordPress side. Soooriii!]. Det var egentlig ikke så svært når det kom til stykket, men det var lige det der med at få det gjort. Folkens, sig velkommen til WordPress på fiskeben.dk.

Selvom jeg har skrevet blog i fem år nu, har jeg desværre ikke alle mine skriverier helt tilbage fra dengang. En stor del gik tabt i Det Store MySQL-idioti sidste år (eller var det året før?), hvor problemer med æøå og den slags ødelagde store dele af min database. Jeg har alligevel konverteret revl og krat. For at gøre en lang historie kort: forvent ikke at gamle indlæg spiller 100%…

En af grundene til den lange ventetid med at komme over på WordPress er, at jeg ikke bare ville bruge et eller andet tema, som alle finder på nettet. Derfor har jeg installeret Sandbox temaet, som er et grundlæggende skelet, som man kan gøre en hel del med bare ved hjælp af CSS. Faktisk har jeg bare slettet to linier i PHP-filerne – resten er CSS. Indtil videre er det temmelig spartansk, men stirrer man længe nok på det, så bliver det utrolig fint. Bare prøv.

Anyway, med en bloggingplatform som rent faktisk gør det interessant at skrive på sin blog, håber jeg hermed at indlægsfrekvensen her skal hæve sig en hel del i den kommende tid. Nu får vi se.

31

jul

3