2010-09-20 6 views
2

J'ai ajouté la recherche plein texte à ma base de données SQL Server 2008 Express et j'ai créé un catalogue d'index pour deux colonnes dans une seule table. Alors maintenant, je dois réécrire une de mes procédures stockées mais je n'ai aucune idée par où commencer. Ce qui suit est mon courant SP que je dois convertir en tirer profit de la recherche en texte intégral Capacité:Requête de recherche FullText SQL Server 2008

ALTER PROCEDURE [dbo].[sp_page_GetPostsBySearchFront] 
(
@Title nvarchar(256), 
@Content nvarchar(MAX), 
@startRowIndex INT, 
@maximumRows INT 
) 
AS 
BEGIN 
SELECT 
    RowNumber, 
    postId, 
    Title, 
    Content, 
    DateCreated, 
    IsPublished, 
    PublishOnDate, 
    Type, 
    MenuName 
FROM 
(
SELECT ROW_NUMBER() OVER (ORDER BY posts.postId DESC) AS RowNumber, 
    posts.postId, 
    posts.Title, 
    posts.Content, 
    posts.DateCreated, 
    posts.IsPublished, 
    posts.PublishOnDate, 
    posts.Type, 
    posts.MenuName 
FROM posts 
GROUP BY 
    posts.postId, 
    posts.Title, 
    posts.Content, 
    posts.DateCreated, 
    posts.IsPublished, 
    posts.PublishOnDate, 
    posts.Type, 
    posts.MenuName 
HAVING (posts.Title LIKE N'%' + @Title + N'%') 
OR (posts.Content LIKE N'%' + @Content + N'%') 
AND (posts.IsPublished = 1) 
AND (posts.PublishOnDate <= GETDATE()) 
) as u 
WHERE u.RowNumber > @startRowIndex 
AND u.RowNumber <= (@startRowIndex + @maximumRows) 

END 

pourrait-on expliquer un peu comment je m'y accomplir cette tâche? Dois-je utiliser CONTAINS ou FREETEXT et où dois-je l'ajouter? Je suis juste perdu sur ça? Je vous remercie!

+1

Pourquoi groupez-vous tous ces articles? –

+0

Vous devez modifier les prédicats qui contiennent des instructions 'like' et y inclure' contains' si vous voulez profiter des requêtes accélérées et vous pouvez laisser ces instructions 'like' en place au cas où vous voudriez plus de précision résultats. –

Répondre

1

OK, Voici ce que j'ai fait pour que ça marche. La raison pour laquelle je recevais le message de mot de bruit est que je n'ai pas correctement défini la valeur de paramètre @search. Une fois que j'ai réalisé cela et l'ai changé, ça fonctionne bien.

ALTER PROCEDURE [dbo].[sp_page_GetPostsByFTS] 
( 
    @search nvarchar(255), 
    @startRowIndex INT, 
    @maximumRows INT 
) 
AS 
BEGIN 
SELECT 
    RowNumber, 
    postId, 
    Title, 
    Content, 
    DateCreated, 
    IsPublished, 
    PublishOnDate, 
    Type, 
    MenuName 
FROM 
( 
    SELECT 
    ROW_NUMBER() OVER (ORDER BY posts.postId DESC) AS RowNumber, 
     posts.postId, 
     posts.Title, 
     posts.Content, 
     posts.DateCreated, 
     posts.IsPublished, 
     posts.PublishOnDate, 
     posts.Type, 
     posts.MenuName 
    FROM posts 
    WHERE FREETEXT((Title,Content),@search) 
    AND (posts.IsPublished = 1) 
    AND (posts.PublishOnDate <= GETDATE()) 
) 
as u 
WHERE u.RowNumber > @startRowIndex 
AND u.RowNumber <= (@startRowIndex + @maximumRows) 
END 
1

Utilisation:

WITH cte AS (
    SELECT ROW_NUMBER() OVER (ORDER BY p.postId DESC) AS RowNumber, 
      p.postId, 
      p.Title, 
      p.Content, 
      p.DateCreated, 
      p.IsPublished, 
      p.PublishOnDate, 
      p.Type, 
      p.MenuName 
     FROM POSTS p 
    WHERE ( CONTAINS(p.title, @Title) 
      OR CONTAINS(p.content, @Content)) 
     AND p.IsPublished = 1 
     AND p.PublishOnDate <= GETDATE()) 
SELECT u.RowNumber, 
     u.postId, 
     u.Title, 
     u.Content, 
     u.DateCreated, 
     u.IsPublished, 
     u.PublishOnDate, 
     u.Type, 
     u.MenuName 
    FROM cte as u 
    WHERE u.RowNumber > @startRowIndex 
    AND u.RowNumber <= (@startRowIndex + @maximumRows) 

Dommage que vous avez différents paramètres pour rechercher les champs de titre et de contenu - could've been consolidated into a single CONTAINS if the parameters are the same value.

Le documentation provides a nice breakdown of when they suggest Full Text Search (FTS) functionality. La plupart des exemples suggèrent CONTIENT/CONTAINSTABLE et utiliser FREETEXT/FREETEXTTABLE pour:

  • Les formes fléchies sont les différents temps d'un verbe ou les formes au singulier et au pluriel d'un nom.
  • Un thesaurus définit des synonymes spécifiés par l'utilisateur pour les termes.
+0

OK, j'ai modifié la requête en utilisant un seul paramètre comme suit, mais cela ne fonctionne pas. Je reçois un message qu'il y a des mots parasites. –

+0

PROCÉDURE ALTER [dbo]. [Sp_page_GetPostsByFTS] ( \t @search nvarchar, \t @startRowIndex INT, \t @maximumRows INT ) AS BEGIN SELECT RowNumber, postId, Titre, contenu, DateCreated, IsPublished, PublishOnDate, type , mENUNAME DE ( SELECT \t ROW_NUMBER() OVER (ORDER BY posts.postId DESC) AS RowNumber, posts.postId, posts.Title, posts.Content, posts.DateCreated, posts.IsPublished, posts.PublishOnDate, posts.Type , posts.MenuName de messages OU CONTIENT ((titre, contenu), @search) ) comme u OÙ u.RowNumber> @startRowIndex ET u.RowNumber <= (+ @startRowIndex @maximumRows) FIN –

+0

@Scott W .: C'est un problème que vous avez avec votre FTS, ce qui nécessite soit [régler les mots parasites] (http://www.sqlnewsgroups.net/group/microsoft.public. serveur SQL.server/topic24791.aspx), ou [encapsuler les résultats des paramètres (@Tile, @Content) entre guillemets] (http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/ 34a3b6fb-275c-4ff7-a547-d9de43aee943). –

Questions connexes