2009-08-15 6 views
0

J'utilise la recherche de texte intégral SQL Server 2008 et je rejoins le tableau FreeTextTable pour déterminer le classement des résultats.Identification des correspondances exactes à partir de SQL Server Recherche de texte intégral

Comment déterminer si l'ensemble de résultats donne une correspondance exacte ou non?

Par exemple, pour une recherche que je peux obtenir ces résultats:

Manufacturer | Rank 
=================== 

LG U300 ------- 102 
LG C1100 ------ 54 
LG GT505 ------ 18 
LG KF300 ------ 18 
LG Callisto --- 18 
... 

La diffusion de la gamme de rang suggère que l'un des résultats est massivement plus pertinent que tous les autres résultats, ce qui indique que le résultat supérieur est très probablement une correspondance exacte pour le terme de recherche.

Mais pour une autre recherche j'obtenir ce résultat:

Manufacturer | Rank 
=================== 

LG C1100------- 33 
LG GC900 ------ 31 
LG GT500 ------ 31 
LG KC910 ------ 31 
LG KF310 ------ 31 
... 

L'absence de propagation de la gamme de rang dans cet ensemble de résultats indique un résultat de recherche inacurate.

Comment puis-je générer une valeur booléenne en tant que colonne supplémentaire dans les résultats qui indique si la répartition du rang suggère que les résultats sont exacts ou non?

Merci!

Répondre

0

Vous pourriez bien sûr utiliser la variance comme un indicateur de «propagation», mais je ne pense pas que ce soit la bonne approche. (Surtout si vous ne regardez que les premiers résultats.)

La pertinence est une grande chose dans la recherche d'information. Cela dépend de la méthode de classement ainsi que de la probabilité d'apparition d'un terme de recherche et de la pertinence d'autres termes de recherche. Quelque chose que vous pourriez faire:

Calculez les occurrences attendues (nombre moyen) d'un terme de recherche dans un document aléatoire. Comparez ensuite le nombre d'occurrences dans le résultat renvoyé. Votre classement sera alors count-in-my-doc/mean-count. Un document est pertinent si le résultat est significativement supérieur à 1.

1

Calculez la différence en pourcentage entre la valeur médiane du jeu de résultats et la valeur la mieux classée. Plus le résultat est grand, plus la précision du match est grande.

Pour le premier jeu de résultats: (102-18)/102 = 82,35%.

Ensuite, définissez une ligne de base dans le code - par exemple, si la propagation est supérieure à 40%, il est probable que la ligne 1 contient un résultat précis. Faites des tests sur diverses recherches pour déterminer la valeur de base.

0

Vous pouvez exécuter des requêtes supplémentaires pour déterminer la qualité de votre comparaison avec la correspondance exacte. Ensuite, vous pouvez prendre le classement exact du benchmark en tant que 100%.

DECLARE @Manufacturer varchar(500) 
DECLARE @tManufacturer varchar(500) 
DECLARE @maxRank int 

SET @Manufacturer = 'your search term' 

SELECT @tManufacturer=Manufacturer 
FROM ManufacturerTable m 
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @Manufacturer, 1) AS KEY_TBL 
ON m.ManufacturerID = KEY_TBL.[KEY] 

if (@tManufacturer is null) 
SET @tManufacturer = @Manufacturer 

SELECT @maxRank=Rank 
FROM ManufacturerTable m 
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @tManufacturer, 1) AS KEY_TBL 
ON m.ManufacturerID = KEY_TBL.[KEY] 

SELECT Manufacturer, KEY_TBL.RANK*100/@maxRank as MatchRank 
FROM ManufacturerTable m 
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @tManufacturer, 10) AS KEY_TBL 
ON m.ManufacturerID = KEY_TBL.[KEY] 

Avertissement: Dans certaines circonstances, vous pouvez obtenir MatchRank > 100 si la solution est parfaite.

Questions connexes