Souvent on me pose des questions sur la pertinence de la recherche FullText de SQL Server.
Pourquoi l’article que je recherchais n’est pas remonté, …ce mot là est plus important que celui-ci, …normalement ce truc là aurait du remonter…, etc.
Il faut bien comprendre que la pertinence est très complexe à calculer. Malgré cela, Microsoft nous en livre la formule dans la MSDN (la formule est la même pour les 2 version) :
- SQL Server 2005 : http://technet.microsoft.com/en-us/library/ms142524(SQL.90).aspx
- SQL Server 2008 : http://technet.microsoft.com/en-us/library/ms142524.aspx
Je vous invite à vous rendre directement à la section Ranking of FreeText qui nous donne la formule OKAPI BM25 servant au calcul du Rank.
Simplement, retenez que la densité est un critère très important. En effet, si on recherche par exemple « fût de sherry » et que « fût » est seul mais dans un texte court, il peut passer devant « fût » et « sherry » noyés dans un long texte. Plus vos textes seront touffus, plus la pertinence sera avérée; par exemple, indexer des titres courts (quelques mots) produira des effets de bord certains.
Voici la formule à titre d’information. Si vous jugez qu’un résultat n’est pas à sa place, vous pouvez le vérifier et porter réclamation auprès de l’éditeur sur Connect. Personnellement, à chaque fois que j’ai constaté de mauvais résultats, c’est qu’il y avait une mauvaise recherche ou bien des données mal renseignées.
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.