Limitare i risultati della ricerca mediante RANK

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Le funzioni CONTAINSTABLE e FREETEXTTABLE restituiscono una colonna chiamata RANK che contiene valori ordinali da 0 a 1.000 (valori di rango). Questi valori classificano le righe in base a quanto corrispondono ai 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 non sono importanti e di solito differiscono ogni volta che la query viene eseguita.

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 troppe corrispondenze, usa il parametro facoltativo top_n_by_rank. Restituisce solo un sottoinsieme di righe. top_n_by_rank è un valore intero, n, che specifica che solo le n corrispondenze di rango più alto vengono restituite, in ordine decrescente. 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.

Il Motore di database di SQL Server ordina le corrispondenze per rango e restituisce solo fino al numero specificato di righe. Ad esempio, una query che normalmente restituisce 100.000 righe da una tabella di 1.000.000 righe viene elaborata più rapidamente se vengono richieste solo le prime 100 righe.

Esempi di utilizzo di RANK per limitare i risultati di ricerca

Esempio A: Ricerca solo delle prime tre corrispondenze

Nell'esempio seguente viene utilizzato CONTAINSTABLE per ottenere solo le prime tre corrispondenze.

USE AdventureWorks2025;
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

Esempio B: Ricerca delle prime cinque corrispondenze

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 AdventureWorks2025;
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

Classificazione dei risultati delle query di ricerca

La ricerca full-text può generare un punteggio opzionale (o valore di rank) che indica la rilevanza dei dati restituiti da una query full-text. Questo valore di rango viene calcolato su ogni riga e può essere usato come criterio di ordinamento per ordinare l'insieme dei risultati di una data query in base alla rilevanza. 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.

Statistiche per il calcolo della priorità

Quando costruisci un indice, il sistema raccoglie statistiche da utilizzare nella classifica. Costruire un catalogo a testo completo non crea direttamente una struttura di indice unica. Invece, il motore Full-Text crea indici intermedi mentre indica i dati. Il motore di ricerca Full-Text quindi unisce questi indici in un indice di dimensioni maggiori secondo le necessità. Questo processo può accadere molte 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.

Sebbene il motore di database classifichi un set di risultati di query, utilizza statistiche provenienti dal più grande indice intermedio. Questo utilizzo dipende dal fatto che gli indici intermedi vengano uniti o meno. Se gli indici intermedi non vengono uniti, l'accuratezza delle statistiche di classificazione può variare. Questa differenza di accuratezza spiega perché la stessa query può restituire risultati di rango diversi nel tempo, man mano che vengono aggiunti, modificati e cancellati dati indicizzati a testo integrale, e quando gli indici più piccoli vengono 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. Nel motore di database 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 sono ciò che gli amministratori vedono come l'unità dell'organizzazione.
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 da separatori di parole specifici della 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 di frase e di prossimità, i fine frase e i fine paragrafo introducono gap di occorrenza più ampi.
TermFrequency Il numero di volte in cui il valore chiave si verifica di fila.
IndexedRowCount Il numero totale di righe indicizzate. Questo valore viene calcolato in base ai conteggi mantenuti 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 grado massimo, 1000, restituito dalla Full-Text Engine.

Problemi nel calcolo delle classifiche

Molti fattori influenzano il processo di calcolo del rango. I word breaker delle diverse lingue suddividono il testo in token in modo diverso. Ad esempio, un word breaker divide la stringa "dog-house" in "dog" e "house", mentre un altro word breaker la tratta come "dog-house". L'abbinamento e la classificazione variano in base alla lingua specificata, perché non solo le parole sono diverse, ma anche la lunghezza del documento lo è. La differenza di lunghezza dei documenti può influire sul calcolo della pertinenza per tutte le query.

Statistiche quali IndexRowCount possono variare notevolmente. Ad esempio, se un catalogo ha 2 miliardi di righe nell'indice master, un nuovo documento viene indicizzato in un indice intermedio in memoria, e i ranghi di quel documento in base al numero di documenti nell'indice in memoria potrebbero essere distorti rispetto ai ranghi dei documenti dall'indice master. Per questo motivo, dopo qualsiasi popolamento che comporti l'indicizzazione o la reindicizzazione di un numero elevato di righe, unire gli indici in un indice principale 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. Questa normalizzazione significa, ad esempio, che un documento di 50 parole viene trattato allo stesso modo di un documento di 100 parole. La tabella seguente mostra 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 };

Classifica di CONTAINSTABLE

Per il calcolo della pertinenza diCONTAINSTABLE viene usato l'algoritmo seguente:

StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )

Le corrispondenze tra frasi sono classificate come le singole chiavi, tranne per il fatto che KeyRowCount (il numero di righe contenenti la frase) è un valore stimato che può essere impreciso e superiore al numero reale.

Calcolo della priorità di NEAR

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 una query a testo intero non specifica un intero come distanza massima, un documento che contiene solo risultati le cui distanze superano i 100 termini logici ha una classificazione pari a 0.

Grado di ISABOUT

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 ) )

Classifica di FREETEXTTABLE

Il ranking di FREETEXTTABLE si basa sulla formula OKAPI BM25. FREETEXTTABLE Le query aggiungono parole alla query tramite generazione flessiva (forme flesse delle parole originali della query). Queste parole sono trattate come parole separate, senza una relazione speciale con le parole da cui sono state generate. 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.