2010-05-03 6 views
1

J'ai deux tables dans une base de données SQL Server 2008 dans mon entreprise. Le premier tableau représente les produits que ma société vend. La deuxième table contient les détails du fabricant du produit. Ces tableaux sont définis comme suit:SQL Server 2008 - Requête de texte intégral

Product 
    ------- 
    ID 
    Name 
    ManufacturerID 
    Description 

    Manufacturer 
    ------------ 
    ID 
    Name 

Comme vous pouvez l'imaginer, je veux que ce soit aussi facile que possible pour nos clients d'interroger ces données. Cependant, j'ai de la difficulté à écrire une requête de recherche qui pardonne, mais puissante. Par exemple, j'anticipe que les gens fassent des recherches selon des orthographes phonétiques. Pour cette raison, les données peuvent ne pas correspondre aux données exactes dans ma base de données. En outre, je pense que certaines personnes vont chercher d'abord par nom de fabricant, mais je veux que les noms de produits correspondants apparaissent en premier. Sur la base de ces exigences, je travaille actuellement sur la requête suivante:

select 
    p.Name as 'ProductName', 
    m.Name as 'Manufacturer', 
    r.Rank as 'Rank' 
    from 
    Product p inner join Manufacturer m on p.ManufacturerID=m.ID 
     inner join CONTAINSTABLE(Product, Name, @searchQuery) as r 

Bizarrement, cette requête est de lancer une erreur. Cependant, je n'ai aucune idée pourquoi. Des gribouillis apparaissent à droite de la dernière parenthèse dans le studio de gestion. L'info-bulle indique "Une expression de type non booléen spécifiée dans un contexte où une condition est attendue". Je comprends ce que cette déclaration signifie. Cependant, je suppose que je ne sais pas comment COneatsTable fonctionne. Qu'est-ce que je fais mal?

Merci

+0

Avez-vous une condition INNER JOIN que vous n'avez pas collée? (par exemple AS ON ON p.ID = r. [KEY]) –

Répondre

2

Tout d'abord, je pense que vous avez besoin d'une clause « ON » lors de son adhésion au CONTAINSTABLE texte intégral. Voir cet exemple de site Microsofts:

USE Northwind; 
GO 
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK 
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
     '("sweet and savory" NEAR sauces) OR 
     ("sweet and savory" NEAR candies)' 
     ) AS KEY_TBL 
     ON FT_TBL.CategoryID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
    AND FT_TBL.CategoryName <> 'Seafood' 
ORDER BY KEY_TBL.RANK DESC; 
GO 

http://msdn.microsoft.com/en-us/library/ms177652.aspx

Vous devez lier la table de produit aux résultats de la recherche correcte en ajoutant une clause de jointure comme ceci:

SELECT 
    p.Name AS 'ProductName', 
    m.Name AS 'Manufacturer', 
    r.Rank AS 'Rank' 
    FROM 
    Product p 
     INNER JOIN Manufacturer m ON p.ManufacturerID=m.ID 
     INNER JOIN CONTAINSTABLE(Product, Name, @searchQuery) AS r 
     ON p.ID = r.[KEY] 

Sinon, vous n » t sait quelles lignes de la table des résultats se joignent aux lignes appropriées des tables source.

Deuxièmement, CONTAINS et CONTAINSTABLE retournent tous deux des correspondances de chaînes exactes sauf si vous utilisez des caractères génériques (par exemple '"bol*"'). Même lorsque vous utilisez des caractères génériques, vous ne pouvez utiliser que des caractères génériques suffixes, donc pour '"bol*"' il trouvera tous les mots qui commencent par 'bol'. '"*bol*"' ne trouvera pas les mots avec 'bol' dans eux. Pour une recherche de style flou non exacte, vous devez utiliser FREETEXT(...) ou FREETEXTTABLE(...).

Renvoie une table de zéro, une ou plusieurs lignes pour les colonnes contenant des types de données à base de caractères pour les valeurs qui correspondent au sens, mais pas le libellé exact, du texte dans le freetext_string spécifié.

http://msdn.microsoft.com/en-us/library/ms177652.aspx

Le compromis est que CONTAINS effectue beaucoup mieux que FREETEXT et FREETEXT fournit des résultats plus naturels. Enfin, si vous voulez faire correspondre phonétiquement SQL Server a la fonction intégrée SOUNDEX qui tente de générer une clé alphanumérique basée sur l'orthographe phonétique ou l'argument.

-- Using SOUNDEX 
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); 

    Copy 
----- ----- 
S530 S530 

(1 row(s) affected) 

http://msdn.microsoft.com/en-us/library/ms187384.aspx

Je vous conseille de ne pas utiliser soundex bien, je l'ai trouvé limite dans le passé parce que Soundex assure vraiment seulement des mots phonétiquement commencer. Soundex renvoie toujours la lettre de départ et les trois premiers sons consonantiques représentés numériquement. Il existe de meilleures versions de l'algorithme conçues pour remplacer soundex, voir Double Metaphone (ou T-SQL version of Double Metaphone que vous pouvez utiliser comme fonction scalaire). Soundex ou DoubleMetaphone ne sont pas intégrés à SQL Server Fulltext, vous devez donc implémenter la recherche manuellement.

SELECT * FROM MyTable where SOUNDEX(MyColumn) = SOUNDEX('MySearchQuery') 
+0

Merci beaucoup pour cette réponse. C'est une réponse tellement détaillée et elle me pointe définitivement dans la bonne direction. – user208662

Questions connexes