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

Fuldtekstsøgninger i MySQL:The Good, the Bad and the Ugly

Nogle gange, når du søger i en MySQL-database, vil du måske køre fuldtekstsøgeforespørgsler mod tegnbaserede data. I dag diskuterer vi fordele og ulemper ved sådanne søgemetoder.

Hvad er fuldtekstsøgninger i MySQL?

Fuldtekstsøgning er en teknik, der sætter dig i stand til at søge efter poster, der muligvis ikke matcher søgekriterierne perfekt. Fuldtekstsøgninger i MySQL udføres, når visse indekser er i brug, og disse indekser har mange unikke nuancer, herunder følgende:

  • For at indekset kan betragtes som et fuldtekstindeks, skal indekset være af typen FULLTEXT.
  • FULLTEXT-indekser kan kun bruges på tabeller, der kører InnoDB- eller MyISAM-lagringsmotorerne.
  • FULLTEXT-indekser kan kun oprettes for CHAR-, VARCHAR- eller TEXT-kolonner.
  • FULLTEXT-indekser bruges kun, når MATCH() AGAINST()-sætningen bruges.
  • Fuldtekstsøgninger har tre tilstande:den naturlige sprogtilstand, den boolske tilstand og forespørgselsudvidelsestilstanden.

Et FULLTEXT indeks er en speciel type indeks, der finder nøgleord i teksten i stedet for at sammenligne værdierne med værdierne i indekset. Selvom FULLTEXT-søgning adskiller sig fra andre typer matchning, skal du være opmærksom på, at du kan have et BTREE-indeks og et FULLTEXT-indeks på samme kolonne på samme tid - de vil ikke være i konflikt, fordi de er egnede til forskellige formål.

Fuldtekstsøgningstyper

Når du kører fuldtekstsøgninger i MySQL, skal du huske på, at der er tre søgetyper at vælge imellem:

  1. En søgetype på naturligt sprog - sådan en søgetilstand fortolker søgestrengen som en bogstavelig sætning. Aktiveret som standard, hvis der ikke er angivet nogen modifikator, eller når modifikatoren I NATURAL LANGUAGE MODE er angivet;
  2. En søgetype for udvidelse af forespørgsler - sådan en søgetilstand udfører søgningen to gange. Når du søger anden gang, indeholder resultatsættet nogle få mest relevante dokumenter fra den første søgning. Aktiveret ved hjælp af WITH QUERY EXPANSION-modifikatoren;
  3. En boolsk søgetype - sådan en søgetilstand gør det muligt at søge efter komplekse forespørgsler, der kan omfatte boolske operatorer såsom mindre end (“<”) og mere end (“>”) operatorer, underudtryk (“( ” og “)”), plustegnet (+), minustegnet (-), dobbelte anførselstegn (“”), en operator, der sænker værdiens bidrag til resultaterne (~) og jokertegnsoperatøren (*) - den wildcard-operatør tillader søgning med fuzzy matching (f.eks. ville "demo*" også matche "demonstration"). Aktiveret ved hjælp af modifikatoren IN BOOLEAN MODE.

Fuld tekstsøgning med Natural Language Search Mode

En naturlig sprogsøgningstilstand, som nævnt ovenfor, er aktiveret som standard, eller når modifikatoren I NATURAL LANGUAGE MODE er angivet. Denne tilstand udfører en naturlig sprogsøgning mod en given tekstsamling (en eller flere kolonner). Det grundlæggende forespørgselsformat for fuldtekstsøgninger i MySQL bør ligne følgende:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Når MATCH() bruges sammen med en WHERE-sætning, sorteres rækkerne automatisk efter den højeste relevans først. For at søge efter en nøjagtig streng, omslut den med dobbelte anførselstegn.

Fuldtekstsøgninger med forespørgselsudvidelsestilstand

Fuldtekstsøgninger understøtter også forespørgselsudvidelsestilstanden. En sådan søgetilstand bruges ofte, når brugeren er afhængig af underforstået viden - for eksempel kan brugeren søge efter "DBMS" i håb om at se både "MongoDB" og "MySQL" i søgeresultaterne. Grunden til, at brugeren muligvis kan stole på noget underforstået viden, når han bruger en sådan søgetilstand, er ret enkel - en fuldtekstsøgning med forespørgselsudvidelsestilstanden fungerer ved at udføre søgningen to gange:den anden søgesætning er den første søgesætning sammenkædet med nogle få mest relevante poster fra den første søgning. Det betyder for eksempel, at hvis en af ​​rækkerne i den første søgning ville indeholde ordet "DBMS" og ordet "MySQL", ville den anden søgning finde de poster, der ville indeholde ordet "MySQL", selvom de ikke gør det. indeholde "DBMS". Forespørgselsformatet, der ville bruge forespørgselsudvidelsestilstanden, ville se sådan ud:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Fuldtekstsøgninger ved brug af boolsk tilstand

Den boolske tilstand er måske en af ​​de mest interessante ting, som MySQL fuldtekstsøgning har at tilbyde. Denne tilstand har mange forbehold, der er unikke, fordi den giver dig mulighed for at udvide søgemulighederne ved hjælp af booleske operatorer. Når den booleske tilstand er i brug, kan visse tegn have en særlig betydning i begyndelsen eller slutningen af ​​ord. For eksempel:

  • “+” betyder OG;
  • “-” betyder IKKE;
  • “(“ og “)”-operatorerne gør det muligt at oprette underudtryk;
  • “<” og ">" operatorer ændrer rangeringen af ​​søgeværdien lavere eller højere;
  • “~” sænker værdiens bidrag til søgeresultaterne;
  • Dobbelt anførselstegn ("") matcher kun bogstavelige værdier;
  • “*” er en jokertegnsoperatør (se forklaringen ovenfor).

Disse operatorer giver dig mulighed for at udvide søgningens funktionalitet:hvis du f.eks. ønsker at hente alle rækker, der indeholder ordet "Demo", men ikke "Demo2", kan du bruge en forespørgsel sådan:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

Du kan også bruge dobbelte anførselstegn sammen med enkelte anførselstegn som f.eks.:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Fuld tekstsøgning Gotchas

Før du bruger fuldtekstsøgning i MySQL, skal du huske på, at søgningen har et par "gotchas":

  • Både InnoDB- og MyISAM-lagringsmotorerne har deres egne lister over stopord. InnoDB stopordsliste kan findes her, MyISAM stopordslisten kan findes her.
    • For at definere din egen stopordsliste for InnoDB skal du definere en tabel med samme struktur som INNODB_FT_DEFAULT_STOPWORD-tabellen, indsætte stopord der, og derefter indstille værdien for indstillingen innodb_ft_server_stopword_table i form af db_name/table_name.
    • For at definere din egen stopordsliste for MyISAM skal du indstille variablen ft_stopword_file til stinavnet på filen, der indeholder stopordslisten. I filen kan stopord adskilles af et hvilket som helst ikke-alfanumberisk tegn undtagen "_" og "'". Standardstopordsfilen er placeret på storage/myisam/ft_static.c. Stopord kan deaktiveres ved at indstille variablen til en tom streng.
  • Fuldtekstsøgninger understøttes ikke på partitionerede tabeller.
  • Alle kolonner i et FULLTEXT-indeks skal bruge samme tegnsæt og sortering.
  • Fuldtekstsøgeoperationer behandler ikke %-strengen som et jokertegn.

Her er en anden hake:Du vil måske også huske på, at den indbyggede FULLTEXT-parser bestemmer, hvor ord starter og slutter ved at se på bestemte tegn, inklusive mellemrummet (" "), komma (", ”) og punktum (“.”), hvilket betyder, at hvis din søgestreng indeholder et eller flere af disse tegn, er søgeresultaterne muligvis ikke nøjagtige. For eksempel, hvis din database indeholder 5 rækker med strengen "test.demo", kan søgeforespørgslen "test.demo" returnere flere (10, 15 osv.) resultater, inklusive "demo", "string.demo_example" osv., fordi den kommer til at søge efter "demo" i stedet for "test.demo", så du kan sidde fast med en masse irrelevante matches. MySQL tilbyder en løsning på dette problem, hvis du er villig til at skrive dit eget plugin i C eller C++ (se MySQL-dokumentationen), men indtil da kan du ikke gøre meget.

Den fulde liste over MySQL's fuldtekstbegrænsninger kan ses på MySQL's dokumentationsside.

Oversigt

MySQL fuldtekstsøgefunktionen giver en enkel måde at implementere forskellige søgeteknikker (søgning i naturligt sprog, søgning på forespørgselsudvidelser og boolsk søgning) i din applikation, der kører MySQL. Hver af disse søgeteknikker har deres egne forbehold, og hver af dem kan være egnet til forskellige formål - når du beslutter dig for, om du vil bruge fuldtekstsøgning, skal du huske på, at denne type søgning har mange finesser, der er unikke for sig selv, kender både fordelene og ulemper ved at bruge fuldtekstsøgning i MySQL og vælg med omhu.


  1. T-SQL Stuff Kommando

  2. Har PL/SQL-udgange i realtid

  3. Gå gennem kolonnerne i RECORD

  4. SOUNDEX() Funktion i Oracle