Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stessoQuesto browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Le funzioni CONTAINSTABLE ed FREETEXTTABLE restituiscono una colonna denominata RANK
che contiene valori ordinali compresi tra 0 e 1000 (valori di rango). Questi valori vengono utilizzati per classificare le righe restituite in base al grado di corrispondenza con i criteri di selezione. I valori di pertinenza indicano solo un ordine relativo di pertinenza delle righe nel set di risultati, dove un valore inferiore indica una pertinenza inferiore. I valori effettivi sono senza importanza e in genere variano ogni volta che viene eseguita la query.
Nota
I predicati CONTAINS
e FREETEXT
non restituiscono valori di rango.
Il numero di articoli corrispondenti a una condizione di ricerca è spesso elevato. Per evitare che le query CONTAINSTABLE
o FREETEXTTABLE
restituiscano un numero eccessivo di risultati, usa il parametro facoltativo top_n_by_rank, che restituisce solo un sottoinsieme di righe.
top_n_by_rank è un numero intero, n, che specifica che devono essere restituite solo le n corrispondenze di rango più alto in ordine discendente. Se il parametro top_n_by_rank viene combinato con altri parametri, la query potrebbe restituire un numero inferiore di righe rispetto al numero di righe effettivamente corrispondenti a tutti i predicati.
SQL Server ordina le corrispondenze per classifica e restituisce solo fino al numero specificato di righe. Questa opzione può comportare un miglioramento significativo delle prestazioni. Una query che normalmente restituisce 100.000 righe di una tabella che contiene 1.000.000 di righe, ad esempio, viene elaborata più rapidamente se vengono richieste solo le prime 100 righe.
Nell'esempio seguente viene utilizzato CONTAINSTABLE
per ottenere solo le prime tre corrispondenze.
USE AdventureWorks2022;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Il set di risultati è il seguente.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
L’esempio seguente utilizza CONTAINSTABLE
per restituire la descrizione dei primi cinque prodotti la cui colonna Description
include la parola "aluminum" accanto alla parola light
o alla parola lightweight
.
USE AdventureWorks2022;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE(Production.ProductDescription,
Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
In SQL Server, la ricerca full-text può generare un punteggio facoltativo (o valore di rango) che indica la pertinenza dei dati restituiti da una query full-text. Questo valore di pertinenza viene calcolato in ogni riga e può essere utilizzato come criteri di ordinamento del set di risultati di una query basato sulla pertinenza. I valori di classifica indicano solo un ordine di rilevanza relativo delle righe nel set di risultati. I valori effettivi sono senza importanza e in genere variano ogni volta che viene eseguita la query. Il valore di rango non mantiene alcun significato nelle query.
Quando viene costruito un indice, vengono raccolte statistiche per l'utilizzo nel ranking. Il processo di compilazione di un catalogo full-text non conduce direttamente a una singola struttura di indice. Il motore di ricerca full-text per SQL Server, al contrario, crea indici intermedi man mano che i dati vengono indicizzati. Il motore di ricerca Full-Text quindi unisce questi indici in un indice di dimensioni maggiori secondo le necessità. Il processo può essere ripetuto più volte. Il motore di ricerca full-text esegue quindi una "fusione master" che combina tutti gli indici intermedi in un grande indice master.
Le statistiche vengono raccolte a ogni livello di indice intermedio. L'unione delle statistiche avviene contemporaneamente a quella degli indici. Alcuni valori statistici possono essere generati solo durante il processo di unione dei master.
Mentre SQL Server classifica un set di risultati di una query, utilizza le statistiche dell'indice intermedio più grande. Ciò varia a seconda che gli indici intermedi siano stati uniti o meno. Se gli indici intermedi non vengono uniti, l'accuratezza delle statistiche di classificazione può variare. Per questo motivo, la stessa query può restituire risultati di classificazione diversi nel tempo, man mano che i dati indicizzati full-text vengono aggiunti, modificati ed eliminati e gli indici più piccoli sono uniti.
Per ridurre al minimo le dimensioni dell'indice e la complessità del calcolo, le statistiche vengono spesso arrotondate.
L'elenco seguente include alcuni termini e valori statistici utilizzati di frequente e importanti per calcolare il valore di rango.
Termine/valore | Descrizione |
---|---|
Proprietà | Una colonna con indicizzazione full-text della riga. |
Documento | L'entità restituita nelle query. In SQL Server, questo corrisponde a una riga. Un documento può disporre di più proprietà, esattamente come una riga può includere più colonne con indicizzazione full-text. |
Indice | Un singolo indice invertito di uno o più documenti. Può essere contenuto completamente nella memoria o su disco. Molte statistiche di query riguardano l'indice specifico nel quale si è verificata la corrispondenza. |
Catalogo testo completo | Una raccolta di indici intermedi gestita come singola entità per le query. I cataloghi rappresentano l'unità di organizzazione visibile all'amministratore di SQL Server. |
Parola, token o elemento | L'unità di corrispondenza del motore full-text. I flussi di testo provenienti dai documenti vengono suddivisi in parole o token attraverso analizzatori di parole specifici per lingua. |
Occorrenza | L'offset di una parola in una proprietà del documento, determinato dal separatore di parole. La prima parola corrisponde all'occorrenza 1, quella successiva all'occorrenza 2 e così via. Per evitare falsi positivi nelle query su frasi e di prossimità, i segni di fine frase e di fine paragrafo introducono gap di occorrenza più ampi. |
TermFrequency | Il numero di volte che il valore della chiave è presente in una riga. |
IndexedRowCount | Il numero totale di righe indicizzate. Viene calcolato in base ai conteggi gestiti negli indici intermedi. L'accuratezza di questo numero può variare. |
KeyRowCount | Il numero totale di righe nel catalogo full-text contenenti una chiave specifica. |
MaxOccurrence | Il valore di occorrenza più grande archiviato in un catalogo full-text per una proprietà specifica di una riga. |
MaxQueryRank | Il massimo grado, 1000, restituito dal motore di testo integrale. |
Il processo di calcolo della priorità dipende da molti fattori. I word breaker delle diverse lingue suddividono il testo in token in modo diverso. Ad esempio, la stringa "dog-house" potrebbe essere suddivisa in "dog" "house" da un divisore di parole e in "dog-house" da un altro. Ciò significa che la corrispondenza e il calcolo della priorità variano in base alla lingua specificata, poiché non solo le parole sono diverse, ma lo è anche la lunghezza dei documenti. La differenza di lunghezza dei documenti può influire sul calcolo della pertinenza per tutte le query.
Statistiche quali IndexRowCount possono variare notevolmente. Se, ad esempio, un catalogo presenta 2 miliardi di righe nell'indice master, un nuovo documento viene indicizzato in un indice intermedio in memoria e la pertinenza corrispondente basata sul numero di documenti dell'indice in memoria potrebbe essere asimmetrica rispetto alla pertinenza per i documenti dall'indice master. Per questo motivo, dopo ogni popolazione che determina l'indicizzazione o la reindicizzazione di un grande numero di righe, è consigliabile unire gli indici in un indice master utilizzando l'istruzione Transact-SQL ALTER FULLTEXT CATALOG ... REORGANIZE
. Il motore di ricerca full-text, inoltre, unisce automaticamente gli indici in base a parametri quali il numero e le dimensioni di indici intermedi.
I valoriMaxOccurrence vengono normalizzati in 1 di 32 intervalli. Ciò significa, ad esempio, che un documento di 50 parole di lunghezza viene gestito come un documento di 100 parole. Di seguito viene riportata la tabella utilizzata per la normalizzazione. Poiché le lunghezze rientrano nell'intervallo tra i valori di tabella adiacenti 32 e 128, i documenti vengono di fatto gestiti come se avessero la stessa lunghezza, 128 (32 <docLength
<= 128).
{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };
Per il calcolo della pertinenza diCONTAINSTABLE viene usato l'algoritmo seguente:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Il calcolo della pertinenza per le corrispondenze di frase è analogo a quello delle chiavi singole, tranne per il fatto che KeyRowCount (il numero di righe contenenti la frase) è il risultato di una stima e può essere impreciso e maggiore del numero effettivo.
CONTAINSTABLE
supporta l'esecuzione di query per due o più termini di ricerca prossimi l'uno all'altro tramite l'opzione NEAR
. Il valore di rango di ogni riga restituita è basato su diversi parametri. Un importante fattore di posizionamento è il numero complessivo di corrispondenze (o riscontri) in relazione alla lunghezza del documento. Pertanto se, ad esempio, un documento di 100 parole e un documento 900 parole contengono corrispondenze identiche, il documento di 100 parole avrà un valore di pertinenza più in alto.
La lunghezza totale di ogni hit in una riga contribuisce inoltre al calcolo della priorità di tale riga in base alla distanza tra i primo e l'ultimo termine di ricerca di tale hit. Minore è la distanza, maggiore è il contributo dell'impatto al valore di pertinenza della riga. Se in una query full-text non viene specificato un valore intero come distanza massima, un documento che contiene solo hit le cui distanze sono maggiori di 100 termini logici ha un valore di priorità pari a 0.
CONTAINSTABLE
supporta le query per termini ponderati tramite l'opzione ISABOUT
.
ISABOUT
è una query per lo spazio vettoriale nella terminologia tradizionale relativa al recupero delle informazioni. L'algoritmo predefinito per il calcolo della pertinenza è di tipo Jaccard, una formula molto nota. La priorità viene calcolata per ogni termine nella query e quindi combinata come descritto nell’algoritmo di seguito.
ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank = ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
+ ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )
Il ranking di FREETEXTTABLE si basa sulla formula OKAPI BM25. Le query FREETEXTTABLE
aggiungono parole alla query tramite generazione flessiva (forme flesse delle parole della query originale). Queste parole vengono gestite separatamente, senza nessuna relazione particolare con le parole di origine. I sinonimi generati dal thesaurus vengono gestiti come termini separati, con lo stesso valore ponderato. Ogni parola nella query contribuisce alla classifica.
Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.
Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stessoFormazione
Modulo
Implementare le funzionalità di ricerca avanzate in Azure AI Search - Training
Usare le funzionalità più avanzate di Azure AI Search per migliorare le soluzioni di ricerca esistenti. Informazioni su come modificare la classificazione nei documenti, eseguire il boosting dei termini più importanti per l'organizzazione e consentire la ricerca in più lingue.