Domanda

Ho appena letto un post che menziona " ricerca a testo integrale " in SQL.

Mi stavo solo chiedendo quale sia la differenza tra FTS e LIKE. Ho letto un paio di articoli ma non sono riuscito a trovare nulla che lo spiegasse bene.

È stato utile?

Soluzione

In generale, esiste un compromesso tra "precisione". e "richiamo". Alta precisione significa che vengono presentati meno risultati irrilevanti (nessun falso positivo), mentre un alto richiamo significa che mancano meno risultati rilevanti (nessun falso negativo). L'utilizzo dell'operatore LIKE offre una precisione del 100% senza alcuna concessione per il richiamo. Una funzione di ricerca full-text offre molta flessibilità per ottimizzare la precisione per un migliore richiamo.

La maggior parte delle implementazioni di ricerca full-text usa un "indice invertito". Questo è un indice in cui le chiavi sono termini individuali e i valori associati sono insiemi di record che contengono il termine. La ricerca full-text è ottimizzata per calcolare l'intersezione, l'unione, ecc. Di questi set di record e di solito fornisce un algoritmo di classificazione per quantificare in che misura un determinato record corrisponde alle parole chiave di ricerca.

L'operatore SQL LIKE può essere estremamente inefficiente. Se lo applichi a una colonna non indicizzata, verrà utilizzata una scansione completa per trovare le corrispondenze (proprio come qualsiasi query su un campo non indicizzato). Se la colonna è indicizzata, la corrispondenza può essere eseguita con le chiavi di indice, ma con un'efficienza molto inferiore rispetto alla maggior parte delle ricerche di indice. Nel peggiore dei casi, il modello LIKE avrà i caratteri jolly iniziali che richiedono l'esame di ogni chiave di indice. Al contrario, molti sistemi di recupero delle informazioni possono abilitare il supporto per i caratteri jolly principali pre-compilando alberi di suffissi nei campi selezionati.

Altre caratteristiche tipiche della ricerca full-text sono

  • analisi lessicale o tokenizzazione — interruzione a blocco di testo non strutturato in singole parole, frasi e token speciali
  • morfologica analisi o derivazione: variazioni collassanti di una determinata parola in un termine indice; ad esempio, il trattamento di "topi" e "mouse", o "elettrificazione" e & Quot; elettrico " come la stessa parola
  • classifica: misurazione di somiglianza di un record corrispondente a la stringa di query

Altri suggerimenti

FTS implica l'indicizzazione delle singole parole all'interno di un campo di testo al fine di rendere veloce la ricerca attraverso molti record. L'uso di LIKE richiede comunque di effettuare una ricerca di stringhe (lineare o simile) all'interno del campo.

MySQL crea un indice dalle parole della colonna di ricerca full-text abilitata ed esegue ricerche su questo indice. MySQL utilizza un sofisticato algoritmo per determinare le righe corrispondenti alla query di ricerca.

Inoltre, da questa risposta SO :

  

La ricerca di testo completo presenta alcuni vantaggi.

     

Indicizzazione:

     

Qualcosa del tipo:

WHERE Foo LIKE '%Bar';
     

Impossibile sfruttare un indice. Deve guardare ogni singola riga e vedere se corrisponde. Un indice full-text, tuttavia, può. In effetti, gli indici full-text possono offrire molta più flessibilità in termini di ordine delle parole corrispondenti, quanto vicine sono quelle parole, ecc.

     

Stemming:

     

Una ricerca full text può contenere parole. Se cerchi run, puoi ottenere risultati per " run " o "in esecuzione". La maggior parte dei motori full-text hanno dizionari radice in una varietà di lingue.

     

Risultati ponderati:

     

Un indice full-text può comprendere più colonne. Ad esempio, puoi cercare " torta di pesche " ;, e l'indice può includere un titolo, parole chiave e un corpo. I risultati che corrispondono al titolo possono essere ponderati più in alto, come più pertinenti, e possono essere ordinati per essere mostrati in alto.

     

Svantaggi:

     

Un indice full-text può potenzialmente essere enorme, molte volte più grande di un indice B-TREE standard. Per questo motivo, molti provider ospitati che offrono istanze di database disabilitano questa funzione o almeno ne fanno pagare un extra. Ad esempio, l'ultima volta che ho controllato, Windows Azure non supportava le query full-text.

     

Anche gli indici full-text possono essere più lenti da aggiornare. Se i dati cambiano molto, potrebbero esserci alcuni ritardi nell'aggiornamento degli indici rispetto agli indici standard.

Like usa solo caratteri jolly e non è poi così potente.

Il testo completo consente ricerche molto più complesse, tra cui And, Or, Not, anche risultati simili (SOUNDEX) e molti altri elementi.

Vorrei iniziare a guardare SQL CONTAINS () FREETEXT () e i relativi elementi di ricerca di testo completo per aiutare a comprendere meglio ciò che è disponibile.

La vera differenza sono le metodologie di scansione. Per la ricerca full-text, le parole (termini) vengono utilizzate come chiavi hash - ognuna delle quali è associata a una matrice di documenti in cui appaiono le chiavi (termini). È così:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

Ora matrice di documenti term (quale membro del termine di quale documento) può essere rappresentata come:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Quando arriva la richiesta che richiede " Ricevi tutti i documenti contenenti la parola / termine t1 " - quindi viene restituito il set di documenti {d1, d5, d9, .. dn }.

Potresti hackerare uno schema di tabella non normalizzato per archiviare documenti - ogni riga nella tabella MySQL sarà considerata come "documento". e una colonna TEXT potrebbe contenere un paragrafo, ecc. L'indice invertito conterrà i termini come chiavi hash e gli ID riga come ID documento.

Ricorda che questa query SQL avrà più o meno prestazioni O (1). La query sarà indipendente da

  1. Numero di parole / termini nella colonna TEXT
  2. Il numero di righe / documenti corrispondenti ai criteri
  3. La lunghezza delle parole / dei termini

Ad esempio questo SQL potrebbe essere attivato per estrarre tutte le righe che corrispondono alla parola data XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

Avvertenza: se aggiungi ORDER BY a questa query, i tempi di esecuzione variano in base ai diversi parametri, uno dei quali è il numero di righe / documenti corrispondenti. Quindi attenzione.

Il LIKE tuttavia non ha nulla di tutto ciò. È costretto a scansionare linearmente la frase / stringa e trovare tutti i termini corrispondenti. L'aggiunta di caratteri jolly aggiunge al caos. Funziona benissimo per stringhe di piccole dimensioni, come puoi immaginare, ma fallirà miseramente per frasi più lunghe. E sicuramente non confrontabile quando si ha un paragrafo o un'intera pagina di testo ecc.

FTS è più efficiente, potente (specialmente per Word Breaker e funzionalità di derivazione)  ... ma controlla i tuoi requisiti perché a volte i DB non supportano tutte le lingue, ad esempio MSSQL non supporta il greco (controlla in questa pagina http://msdn.microsoft.com/en-us/library/ms176076 (v = sql.110) .aspx )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top