Informazioni sul calcolo della pertinenza
La ricerca full-text in Microsoft SQL Server può generare un punteggio (o valore di pertinenza) che indica la pertinenza dei dati restituiti. Il valore di pertinenza per riga può essere considerato un criterio utilizzabile allo scopo di ordinare il set di risultati per pertinenza.
[!NOTA] Il valore di pertinenza considera la pertinenza solo per una query specifica e non ha rilevanza da una query all'altra.
Statistiche per il calcolo della pertinenza
Al momento della creazione di un indice vengono raccolte statistiche per l'utilizzo nei calcolo della pertinenza. Il processo di creazione di un catalogo full-text non conduce direttamente a una singola struttura di indice. Il servizio Microsoft Full-Text Engine for SQL Server (MSFTESQL), al contrario, crea indici intermedi man mano che i dati vengono indicizzati. Se necessario, MSFTESQL unisce quindi tali indici in un indice più grande. Il processo può essere ripetuto più volte. MSFTESQL esegue infine un'unione nell'indice master per associare 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 nell'indice master.
Alcune delle statistiche utilizzate durante il calcolo della pertinenza per un set di risultati della query potrebbero provenire da indici intermedi più piccoli che soddisfano la query e altre dall'indice master. Ciò varia a seconda che gli indici intermedi siano stati uniti o meno. Se gli indici intermedi non sono stati uniti, l'accuratezza delle statistiche per il calcolo della pertinenza può variare. Per questo motivo la stessa query può restituire nel tempo risultati di pertinenza diversi, man mano che i dati con indicizzazione full-text vengono aggiunti, modificati ed eliminati e vengono uniti gli indici più piccoli.
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 calcolo della pertinenza:
- Property
Una colonna con indicizzazione full-text della riga.
- Document
L'entità restituita nelle query. In SQL Server corrisponde a una riga. Un documento può disporre di più proprietà, esattamente come una riga può includere più colonne con indicizzazione full-text.
- Index
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.
- Full-Text Catalog
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.
- Word, token o item
L'unità di corrispondenza del motore full-text. I flussi di testo dai documenti vengono suddivisi in parole o token da word breaker specifici della lingua.
- Occurrence
L'offset delle parole in una proprietà del documento, determinato dal word breaker. 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à, indicatori di fine frase e indicatori di fine paragrafo introducono gap di occorrenza più grandi.
- Catalog Key
Combinazione della parola e della proprietà contenente la parola.
- HitCount
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 rango massimo, 1000, restituito da MSFTESQL.
Problemi nel calcolo della pertinenza
Il processo di calcolo della pertinenza dipende da alcuni fattori. I word breaker delle diverse lingue suddividono il testo in token in modo diverso. La stringa "pick-up", ad esempio, potrebbe essere suddivisa in "pick" "up" da un word breaker e in "pick-up" da un altro. Ciò significa che la corrispondenza e il calcolo della pertinenza 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 popolamento che determini l'indicizzazione o la reindicizzazione di un grande numero di righe è consigliabile unire gli indici in un indice master utilizzando l'istruzione ALTER FULLTEXT CATALOG ... REORGANIZE DDL. MSFTESQL inoltre unirà automaticamente gli indici in base a parametri quali il numero e le dimensioni degli indici intermedi.
I valori MaxOccurrence 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 };
Nei casi in cui top_n_by_rank venga utilizzato con la nuova opzione per la pertinenza pre-calcolata, è possibile eseguire un arrotondamento aggiuntivo durante il calcolo della pertinenza. Potrebbe pertanto sussistere qualche differenza nei valori, a seconda che tale opzione sia attivata o meno.
Calcolo della pertinenza di CONTAINSTABLE
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.
Calcolo della pertinenza di 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 pertinenza viene calcolata per ogni termine nella query, quindi combinata come descritto 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] ContainsRankKey2 )
+ ( Σ[key=1 to n] WeightKey2 ) - ( WeightedSum ) )
Calcolo della pertinenza di FREETEXT
Il calcolo della pertinenza di FREETEXT si basa sulla formula di calcolo della pertinenza OKAPI BM25. Le query FREETEXT aggiungono parole alla query tramite generazione flessiva (forme flesse delle parole della query originale). Queste parole vengono gestite separatamente, senza nessuna relazione particolare con quelle di origine. I sinonimi generati dal thesaurus vengono gestiti come termini separati, con lo stesso valore ponderato. Ogni parola nella query contribuisce alla pertinenza.
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.
Vedere anche
Altre risorse
CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)