2009-01-12 8 views
2

Comment comparer le champ de texte d'un enregistrement à tous les autres enregistrements du serveur SQL pour renvoyer, par exemple, les 5 premiers enregistrements les plus associés?Comparaisons d'index de texte intégral dans SQL Server 2005 Express

Un exemple de la fonctionnalité que je suis après sont les différents plugins Related Posts pour Wordpress qui produisent une liste de liens vers des articles liés à l'article en cours de visualisation.

Cheers, Iain

Répondre

0

Vous devez utiliser CONTAINSTABLE, cela renvoie une colonne RANK vous pouvez utiliser pour trier.

SELECT TOP 5 [Key] FROM CONTAINSTABLE ([YourFullText],'SomethingToSearch') 
ORDER BY [RANK] DESC 
1

Merci pour ces réponses. Je connais les fonctions référencées, mais je ne suis pas sûr qu'elles fassent ce dont j'ai besoin. Par exemple:

SELECT P.id, 'Product' AS Type, FT.rank, C.url + '/' + P.url AS url, longTitle, shortTitle, P.description 
FROM Products P 
    INNER JOIN CONTAINSTABLE (Products, (longTitle, shortTitle), '"my text content"') AS FT ON P.id = FT.[key] 
    LEFT JOIN Product_Categories PC ON P.id = PC.productID 
    LEFT Join Categories C ON C.id = PC.categoryID 
WHERE [primary] = 1 
ORDER BY rank DESC 

retourne uniquement les lignes avec l'expression exacte « mon contenu texte » - J'ai besoin de lignes avec seulement « texte » à retourner, mais à un rang inférieur. Si je change la requête comme suit:

SELECT P.id, 'Product' AS Type, FT.rank, C.url + '/' + P.url AS url, longTitle, shortTitle, P.description 
FROM Products P 
    INNER JOIN CONTAINSTABLE (Products, (longTitle, shortTitle), '"my" or "text" or "content"') AS FT ON P.id = FT.[key] 
    LEFT JOIN Product_Categories PC ON P.id = PC.productID 
    LEFT Join Categories C ON C.id = PC.categoryID 
WHERE [primary] = 1 
ORDER BY rank DESC 

Je reçois plus de lignes, mais les lignes avec les trois mots ne semblent pas classer nettement plus élevé que les lignes avec 1 des mots.

D'autres réflexions?

Questions connexes