ricerca - sqlserver contain




Che cos'è la ricerca full-text vs LIKE (4)

Ho appena letto un post che menziona "ricerca full text" in SQL.

Mi stavo chiedendo quale sia la differenza tra FTS e LIKE. Ho letto un paio di articoli ma non ho trovato nulla che lo spiegasse bene.


Come usi solo i caratteri jolly, e non è poi così potente.

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

Vorrei iniziare a guardare SQL CONTAINS () FREETEXT () e gli elementi di ricerca Full Text correlati per ottenere una migliore comprensione di ciò che è disponibile.



In generale, c'è un compromesso tra "precisione" e "richiamo". Alta precisione significa che vengono presentati meno risultati irrilevanti (nessun falso positivo), mentre un alto richiamo indica che mancano meno risultati rilevanti (nessun falso negativo). L'utilizzo dell'operatore LIKE offre una precisione del 100% senza concessioni per il richiamo. Una funzione di ricerca a testo completo ti offre una grande flessibilità per mettere a punto la precisione per un migliore richiamo.

La maggior parte delle implementazioni di ricerca full text utilizzano 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 di testo completo è ottimizzata per calcolare l'intersezione, l'unione, ecc. Di questi set di record e di solito fornisce un algoritmo di classificazione per quantificare la forza con cui un dato record corrisponde alle parole chiave di ricerca.

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

Altre caratteristiche tipiche della ricerca full-text sono

  • analisi lessicale o tokenizzazione - rompere un blocco di testo non strutturato in singole parole, frasi e token speciali
  • analisi morfologica, o derivazione-collasso di variazioni di una determinata parola in un unico termine indicizzato; per esempio, trattando "mouse" e "mouse", o "elettrificazione" e "elettrico" come la stessa parola
  • classifica: misura la somiglianza di un record corrispondente con la stringa di query

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

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

Ora la matrice del termine-documento (quale membro di 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 chiedendo "Get me all documents documents with the word / term t1" {d1, d5, d9,.. dn viene restituito il set di documenti {d1, d5, d9,.. dn }.

Si può hackerare uno schema di tabella de-normalizzato per archiviare i 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 del documento.

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

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

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

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

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

Il LIKE tuttavia non ha nulla di questo. È costretto a scansionare linearmente la frase / stringa e trovare tutti i termini corrispondenti. L'aggiunta di jolly aggiunge problemi. Funziona benissimo per stringhe di piccola lunghezza, come puoi immaginare, ma fallirà miseramente per frasi più lunghe. E sicuramente non paragonabile quando si ha un paragrafo o un'intera pagina di testo, ecc.







sql-like