sql >> Database teknologi >  >> RDS >> Mysql

Hvordan får du din booleske fuldtekstsøgning til at opfange udtrykket C++?

Du bliver nødt til at ændre MySQL's idé om, hvad et ord er.

For det første er standard mindste ordlængde 4. Det betyder, at ingen søgeterm, der kun indeholder ord på <4 bogstaver, nogensinde vil matche, uanset om det er 'C++' eller 'cpp'. Du kan konfigurere dette ved at bruge ft_min_word_len a> indstillingsmulighed, f.eks. i din my.cfg:

[mysqld]
ft_min_word_len=3

(Stop/start derefter MySQLd og genopbyg fuldtekstindekser.)

For det andet betragtes '+' ikke som et bogstav af MySQL. Du kan gøre det til et bogstav, men så betyder det, at du ikke kan søge på ordet 'fisk' i strengen 'fish+chips', så en vis omhu er påkrævet. Og det er ikke trivielt:det kræver genkompilering af MySQL eller hacking af et eksisterende tegnsæt. Se afsnittet, der begynder "Hvis du vil ændre det sæt af tegn, der betragtes som ordtegn..." i afsnit 11.8.6 af dok.

Ja, sådan noget er en almindelig løsning:du kan opbevare dine 'rigtige' data (uden at undslippe) i en primær, definitiv tabel — normalt ved at bruge InnoDB til ACID-overholdelse. Derefter kan en ekstra MyISAM-tabel tilføjes, som kun indeholder de forskårne ord til fuldtekstsøgningslokkemad. Du kan også lave en begrænset form for stemming ved at bruge denne tilgang.

En anden mulighed er at opdage søgninger, som MySQL ikke kan udføre, såsom dem med kun korte ord eller usædvanlige tegn, og falde tilbage til en simpel, men langsom LIKE eller REGEXP-søgning kun for disse søgninger. I dette tilfælde vil du sandsynligvis også ønske at fjerne stoplisten ved at indstille ft_stopword_file til en tom streng, da det ikke er praktisk at samle alt i det som specielt.



  1. Hvordan håndteres to_date undtagelser i en SELECT-sætning for at ignorere disse rækker?

  2. Indlæs CSV-data i MySQL i Python

  3. SELECT, der returnerer en liste over værdier, der ikke forekommer i nogen række

  4. Almindelige ER-diagramfejl