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

Ricerche full-text in MySQL:il buono, il brutto e il cattivo

A volte durante la ricerca in un database MySQL potresti voler eseguire query di ricerca full-text su dati basati sui caratteri. Oggi discutiamo i vantaggi e gli svantaggi di tali metodi di ricerca.

Cosa sono le ricerche full-text in MySQL?

La ricerca full-text è una tecnica che consente di cercare record che potrebbero non corrispondere perfettamente ai criteri di ricerca. Le ricerche full-text in MySQL vengono eseguite quando sono in uso determinati indici e tali indici hanno molte sfumature uniche, tra cui le seguenti:

  • Affinché l'indice possa essere considerato un indice full-text, l'indice deve essere di tipo FULLTEXT.
  • Gli indici FULLTEXT possono essere utilizzati solo su tabelle che eseguono i motori di archiviazione InnoDB o MyISAM.
  • Gli indici FULLTEXT possono essere creati solo per le colonne CHAR, VARCHAR o TEXT.
  • Gli indici FULLTEXT vengono utilizzati solo quando viene utilizzata la clausola MATCH() AGAINST().
  • Le ricerche full-text hanno tre modalità:la modalità in linguaggio naturale, la modalità booleana e la modalità di espansione della query.

Un indice FULLTEXT è un tipo speciale di indice che trova le parole chiave nel testo invece di confrontare i valori con i valori nell'indice. Sebbene la ricerca FULLTEXT sia diversa da altri tipi di corrispondenza, tieni presente che puoi avere un indice BTREE e un indice FULLTEXT sulla stessa colonna contemporaneamente:non entreranno in conflitto perché sono adatti a scopi diversi.

Tipi di ricerca full-text

Quando esegui ricerche full-text in MySQL, tieni presente che ci sono tre tipi di ricerca tra cui scegliere:

  1. Un tipo di ricerca in linguaggio naturale:tale modalità di ricerca interpreta la stringa di ricerca come una frase letterale. Abilitato per impostazione predefinita se non è specificato alcun modificatore o quando è specificato il modificatore IN LINGUA NATURALE;
  2. Un tipo di ricerca di espansione della query:tale modalità di ricerca esegue la ricerca due volte. Quando si esegue la ricerca per la seconda volta, il set di risultati include alcuni documenti più rilevanti della prima ricerca. Abilitato utilizzando il modificatore WITH QUERY EXPANSION;
  3. Un tipo di ricerca booleana:tale modalità di ricerca consente di cercare query complesse che possono includere operatori booleani come operatori minore di ("<") e maggiore di (">"), sottoespressioni ("( ” e “)”)), il segno più (+), il segno meno (-), le virgolette (“”), un operatore che riduce il contributo del valore ai risultati (~) e l'operatore jolly (*) - il l'operatore jolly consente la ricerca con corrispondenza fuzzy (ad esempio, "demo*" corrisponderebbe anche a "dimostrazione"). Abilitato utilizzando il modificatore IN BOOLEAN MODE.

Ricerche full-text con la modalità di ricerca in linguaggio naturale

Una modalità di ricerca in linguaggio naturale, come indicato sopra, è abilitata per impostazione predefinita o quando è specificato il modificatore IN MODALITÀ LINGUA NATURALE. Questa modalità esegue una ricerca in linguaggio naturale su una data raccolta di testo (una o più colonne). Il formato di query di base delle ricerche full-text in MySQL dovrebbe essere simile al seguente:

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

Quando MATCH() viene utilizzato insieme a una clausola WHERE, le righe vengono automaticamente ordinate per prime in base alla rilevanza più alta. Per cercare una stringa esatta, racchiuderla tra virgolette.

Ricerche full-text con la modalità di espansione della query

Le ricerche full-text supportano anche la modalità di espansione della query. Tale modalità di ricerca viene spesso utilizzata quando l'utente fa affidamento sulla conoscenza implicita, ad esempio, l'utente potrebbe cercare "DBMS" sperando di vedere sia "MongoDB" che "MySQL" nei risultati della ricerca. Il motivo per cui l'utente potrebbe essere in grado di fare affidamento su alcune conoscenze implicite quando utilizza una tale modalità di ricerca è piuttosto semplice:una ricerca full-text con la modalità di espansione della query funziona eseguendo la ricerca due volte:la seconda frase di ricerca è la prima frase di ricerca concatenato con alcune voci più rilevanti della prima ricerca. Ciò significa che, ad esempio, se nella prima ricerca una delle righe conterrebbe la parola “DBMS” e la parola “MySQL”, la seconda ricerca troverebbe le voci che includerebbero la parola “MySQL” anche se non contengono "DBMS". Il formato della query che utilizzerebbe la modalità di espansione della query sarebbe simile a questo:

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

Ricerche full-text utilizzando la modalità booleana

La modalità booleana è forse una delle cose più interessanti che la ricerca full-text di MySQL ha da offrire. Questa modalità ha molti avvertimenti unici perché consente di espandere le capacità di ricerca utilizzando operatori booleani. Quando è in uso la modalità booleana, alcuni caratteri possono avere un significato speciale all'inizio o alla fine delle parole. Ad esempio:

  • “+” significa AND;
  • "-" significa NON;
  • Gli operatori “(“ e “)” consentono di creare sottoespressioni;
  • Gli operatori “<” e “>” modificano il rango del valore di ricerca in basso o in alto;
  • “~” riduce il contributo del valore ai risultati della ricerca;
  • Le virgolette ("") corrispondono solo ai valori letterali;
  • “*” è un operatore con caratteri jolly (fare riferimento alla spiegazione sopra).

Questi operatori consentono di espandere la funzionalità della ricerca:ad esempio, se si desidera recuperare tutte le righe che contengono la parola “Demo”, ma non “Demo2”, è possibile utilizzare una query così:

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

Puoi anche usare le virgolette doppie insieme alle virgolette singole in questo modo:

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

Ricerca di testo completo

Prima di utilizzare la ricerca full-text in MySQL, tieni presente che la ricerca ha alcuni "problemi":

  • Sia i motori di archiviazione InnoDB che MyISAM hanno i propri elenchi di stopword. L'elenco di stopword di InnoDB può essere trovato qui, l'elenco di stopword di MyISAM può essere trovato qui.
    • Per definire il proprio elenco di stopword per InnoDB, definire una tabella con la stessa struttura della tabella INNODB_FT_DEFAULT_STOPWORD, inserire lì le stopword, quindi impostare il valore dell'opzione innodb_ft_server_stopword_table sotto forma di db_name/table_name.
    • Per definire il tuo elenco di stopword per MyISAM, imposta la variabile ft_stopword_file sul nome del percorso del file contenente l'elenco di stopword. Nel file le stopword possono essere separate da qualsiasi carattere non alfanumerico eccetto "_" e "'". Il file di stopword predefinito si trova in storage/myisam/ft_static.c. Le stopword possono essere disabilitate impostando la variabile su una stringa vuota.
  • Le ricerche full-text non sono supportate su tabelle partizionate.
  • Tutte le colonne in un indice FULLTEXT devono utilizzare lo stesso set di caratteri e regole di confronto.
  • Le operazioni di ricerca full-text non considerano la stringa % come un carattere jolly.

Ecco un altro problema:potresti anche voler tenere a mente che il parser FULLTEXT integrato determina dove le parole iniziano e finiscono guardando determinati caratteri inclusi lo spazio (" "), la virgola (", ”) e punto (“.”), il che significa che se la stringa di ricerca contiene uno o più di questi caratteri, i risultati della ricerca potrebbero non essere accurati. Ad esempio, se il database contiene 5 righe con la stringa "test.demo", la query di ricerca "test.demo" potrebbe restituire più (10, 15 ecc.) risultati inclusi "demo", "string.demo_example" ecc. perché cercherà "demo" invece di "test.demo", quindi potresti rimanere bloccato con molte corrispondenze irrilevanti. MySQL offre una soluzione a questo problema se sei disposto a scrivere il tuo plug-in in C o C++ (vedi documentazione MySQL), ma fino ad allora non puoi fare molto.

L'elenco completo delle restrizioni full-text di MySQL può essere visualizzato nella pagina della documentazione di MySQL.

Riepilogo

La funzionalità di ricerca full-text di MySQL fornisce un modo semplice per implementare varie tecniche di ricerca (ricerca in linguaggio naturale, ricerca per espansione di query e ricerca booleana) nell'applicazione che esegue MySQL. Ognuna di queste tecniche di ricerca ha i propri avvertimenti e ognuna di esse potrebbe essere adatta per scopi diversi:quando decidi se utilizzare la ricerca full-text, tieni presente che questo tipo di ricerca ha molte sottigliezze uniche a se stesso, conosci sia i vantaggi che svantaggi dell'utilizzo della ricerca full-text in MySQL e scegliere saggiamente.