Limitazione dei risultati della ricerca mediante RANKLimit Search Results with RANK

Le funzioni CONTAINSTABLE e FREETEXTTABLE restituiscono una colonna denominata RANK che contiene valori ordinali compresi tra 0 e 1000 (valori di classificazione).The CONTAINSTABLE and FREETEXTTABLE functions return a column named RANK that contains ordinal values from 0 through 1000 (rank values). Questi valori vengono utilizzati per classificare le righe restituite in base al grado di corrispondenza con i criteri di selezione.These values are used to rank the rows returned according to how well they match the selection criteria. 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.The rank values indicate only a relative order of relevance of the rows in the result set, with a lower value indicating lower relevance. I valori effettivi sono senza importanza e in genere variano ogni volta che viene eseguita la query.The actual values are unimportant and typically differ each time the query is run.

Nota

I predicati CONTAINS e FREETEXT non restituiscono alcun valore di pertinenza.The CONTAINS and FREETEXT predicates do not return any rank values.

Il numero di elementi corrispondenti a una condizione di ricerca è spesso molto elevato.The number of items matching a search condition is often very large. Per evitare che le query CONTAINSTABLE o FREETEXTTABLE restituiscano un numero eccessivo di risultati, usare il parametro facoltativo top_n_by_rank che restituisce solo un subset di righe.To prevent CONTAINSTABLE or FREETEXTTABLE queries from returning too many matches, use the optional top_n_by_rank parameter, which returns only a subset of rows. top_n_by_rank è un numero intero, n, che specifica che dovranno essere restituite solo le n corrispondenze con la pertinenza più alta, in ordine discendente.top_n_by_rank is an integer value, n, that specifies that only the n highest ranked matches are to be returned, in descending order. 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.If top_n_by_rank is combined with other parameters, the query could return fewer rows than the number of rows that actually match all the predicates.

SQL ServerSQL Server ordina le corrispondenze per pertinenza e restituisce solo il numero specificato di righe. orders the matches by rank and returns only up to the specified number of rows. Questa opzione può comportare un miglioramento significativo delle prestazioni.This choice can result in a dramatic increase in performance. Una query che normalmente restituisce 100.000 righe di una tabella che contiene un milione di righe, ad esempio, viene elaborata più rapidamente se vengono richieste solo le prime 100 righe.For example, a query that would normally return 100,000 rows from a table of one million rows are processed more quickly if only the top 100 rows are requested.

Esempi di utilizzo di RANK per limitare i risultati della ricerca Examples of Using RANK to Limit Search Results

Esempio A: Ricerca delle prime tre corrispondenzeExample A: Searching for only the top three matches

Nell'esempio seguente viene utilizzato CONTAINSTABLE per restituire solo le prime tre corrispondenze.The following example uses CONTAINSTABLE to return only the top three matches.

USE AdventureWorks2012  
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  

Set di risultati:Here is the result set.

RANK        Address                          City  
----------- -------------------------------- ------------------------------  
172         9005, rue des Bouchers           Paris  
172         5, rue des Bouchers              Orleans  
172         5, rue des Bouchers              Metz  

(3 row(s) affected)  

Esempio B: Ricerca delle prime dieci corrispondenzeExample B: Searching for the top ten matches

Nell'esempio seguente viene utilizzato CONTAINSTABLE per restituire la descrizione dei primi 5 prodotti la cui colonna Description include la parola "aluminum" accanto alla parola "light" o "lightweight".The following example uses CONTAINSTABLE to return the description of the top 5 products where the Description column contains the word "aluminum" near either the word "light" or the word "lightweight".

USE AdventureWorks2012  
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 per pertinenza dei risultati delle query di ricerca How Search Query Results Are Ranked

In SQL ServerSQL Server la ricerca full-text può generare un punteggio facoltativo (o valore di pertinenza) che indica la pertinenza dei dati restituiti da una query full-text.Full-text search in SQL ServerSQL Server can generate an optional score (or rank value) that indicates the relevance of the data returned by a full-text query. 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.This rank value is calculated on every row and can be used as an ordering criteria to sort the result set of a given query by relevance. Il valore di pertinenza indica solo un ordine di pertinenza relativo delle righe nel set di risultati.The rank values indicate only a relative order of relevance of the rows in the result set. I valori effettivi sono senza importanza e in genere variano ogni volta che viene eseguita la query.The actual values are unimportant and typically differ each time the query is run. Il valore di pertinenza non mantiene alcun significato nelle query.The rank value does not hold any significance across queries.

Statistiche per il calcolo della pertinenzaStatistics for Ranking

Al momento della compilazione di un indice vengono raccolte statistiche per l'utilizzo nei calcolo della pertinenza.When an index is built, statistics are collected for use in ranking. Il processo di compilazione di un catalogo full-text non conduce direttamente a una singola struttura di indice.The process of building a full-text catalog does not directly result in a single index structure. Il motore di ricerca full-text per SQL ServerSQL Server , al contrario, crea indici intermedi man mano che i dati vengono indicizzatiInstead, the Full-Text Engine for SQL ServerSQL Server creates intermediate indexes as data is indexed. e successivamente unisce tali indici in un indice di dimensioni maggiori in base alle esigenze.The Full-Text Engine then merges these indexes into a larger index as needed. Il processo può essere ripetuto più volte.This process can be repeated many times. Il motore di ricerca full-text SQL esegue infine un'unione nell'indice master per associare tutti gli indici intermedi in un indice master di dimensioni elevate.The Full-Text Engine then conducts a "master merge" that combines all of the intermediate indexes into one large master index.

Le statistiche vengono raccolte a ogni livello di indice intermedio.Statistics are collected at each intermediate index level. L'unione delle statistiche avviene contemporaneamente a quella degli indici.The statistics are merged when the indexes are merged. Alcuni valori statistici possono essere generati solo durante il processo di unione nell'indice master.Some statistical values can only be generated during the master merging process.

Nella classificazione di un set di risultati della query, in SQL ServerSQL Server vengono utilizzate statistiche in base all'indice intermedio di dimensioni maggiori.While ranking a query result set, SQL ServerSQL Server uses statistics from the largest intermediate index. Ciò varia a seconda che gli indici intermedi siano stati uniti o meno.This depends on whether intermediate indexes have been merged or not. Se gli indici intermedi non sono stati uniti, l'accuratezza delle statistiche per il calcolo della pertinenza può variare.As a result, ranking statistics can vary in accuracy if the intermediate indexes have not been merged. 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.This explains why the same query can return different rank results over time as full-text indexed data is added, modified, and deleted, and as the smaller indexes are merged.

Per ridurre al minimo le dimensioni dell'indice e la complessità del calcolo, le statistiche vengono spesso arrotondate.To minimize the size of the index and computational complexity, statistics are often rounded.

Nell'elenco seguente sono inclusi alcuni termini e valori statistici utilizzati di frequente e importanti per calcolare il valore di pertinenza:The list below includes some commonly used terms and statistical values that are important in calculating rank.

ProprietàProperty
Una colonna con indicizzazione full-text della riga.A full-text indexed column of the row.

DocumentDocument
L'entità restituita nelle query.The entity that is returned in queries. In SQL ServerSQL Server corrisponde a una riga.In SQL ServerSQL Server this corresponds to a row. Un documento può disporre di più proprietà, esattamente come una riga può includere più colonne con indicizzazione full-text.A document can have multiple properties, just as a row can have multiple full-text indexed columns.

IndiceIndex
Un singolo indice invertito di uno o più documenti.A single inverted index of one or more documents. Può essere contenuto completamente nella memoria o su disco.This may be entirely in memory or on disk. Molte statistiche di query riguardano l'indice specifico nel quale si è verificata la corrispondenza.Many query statistics are relative to the individual index where the match occurred.

Catalogo full-textFull-Text Catalog
Una raccolta di indici intermedi gestita come singola entità per le query.A collection of intermediate indexes treated as one entity for queries. I cataloghi rappresentano l'unità di organizzazione visibile all'amministratore di SQL ServerSQL Server .Catalogs are the unit of organization visible to the SQL ServerSQL Server administrator.

Word, token o itemWord, token or item
L'unità di corrispondenza del motore full-text.The unit of matching in the full-text engine. I flussi di testo dai documenti vengono suddivisi in parole o token da word breaker specifici della lingua.Streams of text from documents are tokenized into words, or tokens by language-specific word breakers.

OccorrenzaOccurrence
L'offset delle parole in una proprietà del documento, determinato dal word breaker.The word offset in a document property as determined by the word breaker. La prima parola corrisponde all'occorrenza 1, quella successiva all'occorrenza 2 e così via.The first word is at occurrence 1, the next at 2, and so on. 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.In order to avoid false positives in phrase and proximity queries, end-of-sentence and end-of-paragraph introduce larger occurrence gaps.

TermFrequencyTermFrequency
Il numero di volte che il valore della chiave è presente in una riga.The number times the key value occurs in a row.

IndexedRowCountIndexedRowCount
Il numero totale di righe indicizzate.Total number of rows indexed. Viene calcolato in base ai conteggi gestiti negli indici intermedi.This is computed, based on counts maintained in the intermediate indexes. L'accuratezza di questo numero può variare.This number can vary in accuracy.

KeyRowCountKeyRowCount
Il numero totale di righe nel catalogo full-text contenenti una chiave specifica.Total number of rows in the full-text catalog that contain a given key.

MaxOccurrenceMaxOccurrence
Il valore di occorrenza più grande archiviato in un catalogo full-text per una proprietà specifica di una riga.The largest occurrence stored in a full-text catalog for a given property in a row.

MaxQueryRankMaxQueryRank
Il valore di pertinenza massimo, 1000, restituito dal motore di ricerca full-text.The maximum rank, 1000, returned by the Full-Text Engine.

Problemi nel calcolo della pertinenzaRank Computation Issues

Il processo di calcolo della pertinenza dipende da alcuni fattori.The process of computing rank, depends on a number of factors. I word breaker delle diverse lingue suddividono il testo in token in modo diverso.Different language word breakers tokenize text differently. La stringa "pick-up", ad esempio, potrebbe essere suddivisa in "pick" "up" da un word breaker e in "pick-up" da un altro.For example, the string "dog-house" could be broken into "dog" "house" by one word breaker and into "dog-house" by another. 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.This means that matching and ranking will vary based on the language specified, because not only are the words different, but so is the document length. La differenza di lunghezza dei documenti può influire sul calcolo della pertinenza per tutte le query.The document length difference can affect ranking for all queries.

Statistiche quali IndexRowCount possono variare notevolmente.Statistics such as IndexRowCount can vary widely. 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.For example, if a catalog has 2 billion rows in the master index, then one new document is indexed into an in-memory intermediate index, and ranks for that document based on the number of documents in the in-memory index could be skewed compared with ranks for documents from the master index. 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 ... Istruzione Transact-SQLTransact-SQL REORGANIZE.For this reason, it is recommended that after any population that results in large number of rows being indexed or re-indexed the indexes be merged into a master index using the ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQLTransact-SQL statement. Il motore di ricerca full-text, inoltre, unirà automaticamente gli indici in base a parametri quali il numero e le dimensioni di indici intermedi.The Full-Text Engine will also automatically merge the indexes based on parameters such as the number and size of intermediate indexes.

I valoriMaxOccurrence vengono normalizzati in 1 di 32 intervalli.MaxOccurrence values are normalized into 1 of 32 ranges. Ciò significa, ad esempio, che un documento di 50 parole di lunghezza viene gestito come un documento di 100 parole.This means, for example, that a document 50 words long is treated the same as a document 100 words long. Di seguito viene riportata la tabella utilizzata per la normalizzazione.Below is the table used for normalization. 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).Because the document lengths are in the range between adjacent table values 32 and 128, they are effectively treated as having the same length, 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 };  

Calcolo della pertinenza di CONTAINSTABLERanking of CONTAINSTABLE

Per il calcolo della pertinenza diCONTAINSTABLE viene usato l'algoritmo seguente:CONTAINSTABLE ranking uses the following algorithm:

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.Phrase matches are ranked just like individual keys except that KeyRowCount (the number of rows containing the phrase) is estimated and can be inaccurate and higher than the actual number.

Calcolo della pertinenza di NEARRanking of NEAR

CONTAINSTABLE supporta l'esecuzione di query per due o più termini di ricerca prossimi l'uno all'altro tramite l'opzione NEAR.CONTAINSTABLE supports querying for two or more search terms in proximity to each other by using the NEAR option. Il valore di pertinenza di ogni riga restituita è basato su diversi parametri.The rank value of each returned row is based on several parameters. Un importante fattore di pertinenza è il numero complessivo di corrispondenze (o riscontri) in relazione alla lunghezza del documento.One major ranking factor is the total number of matches (or hits) relative to the length of the document. 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.Thus, for example, if a 100-word document and a 900-word document contain identical matches, the 100-word document is ranked higher.

La lunghezza totale di ogni riscontro in una riga contribuirà inoltre al calcolo della pertinenza di tale riga in base alla distanza tra i primo e l'ultimo termine di ricerca di tale riscontro.The total length of each hit in a row will also contribute to the ranking of that row based on the distance between the first and last search terms of that hit. Minore è la distanza, maggiore sarà il contributo del riscontro al valore di pertinenza della riga.The smaller the distance, the more the hit contributes to the rank value of the row. Se in una query full-text non viene specificato un valore intero come distanza massima, un documento che contiene solo riscontri le cui distanze sono maggiori di 100 termini logici avrà un valore di pertinenza pari a 0.If a full-text query does not specify an integer as the maximum distance, a document that contains only hits whose distances are greater than 100 logical terms apart, will have a ranking of 0.

Calcolo della pertinenza di ISABOUTRanking of ISABOUT

CONTAINSTABLE consente di eseguire query per termini ponderati tramite l'opzione ISABOUT.CONTAINSTABLE supports querying for weighted terms by using the ISABOUT option. ISABOUT è una query per lo spazio vettoriale nella terminologia tradizionale relativa al recupero delle informazioni.ISABOUT is a vector-space query in traditional information retrieval terminology. L'algoritmo predefinito per il calcolo della pertinenza è di tipo Jaccard, una formula molto nota.The default ranking algorithm used is Jaccard, a widely known formula. La pertinenza viene calcolata per ogni termine nella query, quindi combinata come descritto di seguito.The ranking is computed for each term in the query and then combined as described below.

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

Calcolo della pertinenza di FREETEXTTABLERanking of FREETEXTTABLE

Il calcolo della pertinenza diFREETEXTTABLE si basa sulla formula OKAPI BM25.FREETEXTTABLE ranking is based on the OKAPI BM25 ranking formula. 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.FREETEXTTABLE queries will add words to the query via inflectional generation (inflected forms of the original query words); these words are treated as separate words with no special relationship to the words from which they were generated. I sinonimi generati dal thesaurus vengono gestiti come termini separati, con lo stesso valore ponderato.Synonyms generated from the Thesaurus feature are treated as separate, equally weighted terms. Ogni parola nella query contribuisce alla pertinenza.Each word in the query contributes to the rank.

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 ancheSee Also

Esecuzione della query con ricerca Full-TextQuery with Full-Text Search