MySQL Cookbook by

Diskussion

For at finde poster, der indeholder en bestemt sætning, kan du ikke bruge en simpel FULLTEXTsøgning:

mysql>  -> +----------+| COUNT(*) |+----------+| 548 |+----------+

Søgningen returnerer et resultat, men det er ikke det resultat, du leder efter. En FULLTEXTsøgning beregner en relevansrækkefølge baseret på tilstedeværelsen af hvert enkelt ord, uanset hvor det forekommer i kolonnen vtext, og rækkefølgen vil være ikke-nul, så længe et af ordene er til stede. Derfor har denne form for søgning en tendens til at finde for mange poster.

Som i MySQL 4.0.2 understøtter FULLTEXT-søgning søgning efter udtryk i boolsk tilstand. For at bruge den, skal du blot placere sætningen inden for dobbelte anførselstegn.

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

For 4.0.2 er det nødvendigt med en omgåelse. Du kan bruge enIN BOOLEANMODE søgning for at kræve, at hvert ord skal være til stede, men det løser ikke rigtig problemet, fordi ordene stadig kan forekomme i en hvilken som helst rækkefølge:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 3 |+----------+

Hvis du i stedet bruger et SQL-mønstermatch, returnerer det det korrekte resultat:

Det er dog sandsynligt, at brugen af et SQL-mønstermatch er langsommere end enFULLTEXT søgning. Så det ser ud til, at du har det ubehagelige valg mellem at bruge en metode, der er hurtigere, men som ikke giver det ønskede resultat, eller en metode, der fungerer korrekt, men som er langsommere. Heldigvis er det ikke dine eneste muligheder. Du kan kombinere begge metoder i den samme forespørgsel:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Det giver dig det bedste af begge typer matchning:

  • Med MATCH( )-udtrykket kan MySQL udføre en FULLTEXT-søgning for at producere et sæt af kandidatrækker, der indeholder ord i udtrykket. Dette indsnævrer søgningen betydeligt.

  • Med SQL-mønsterprøven kan MySQL søge i kandidatrækkerne for kun at producere de poster, der har alle ordene arrangeret i den korrekte rækkefølge.

Denne teknik vil mislykkes, hvis alle ordene er mindre end indekseringsmotorens mindste ordlængde eller forekommer i mere end halvdelen af posterne. I så fald returnerer FULLTEXTsøgningen ingen poster overhovedet. Du kan finde posterne ved hjælp af etSQL-mønstermatch.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.