SQL Server 2008 Полнотекстовый поисковый запрос - PullRequest
2 голосов
/ 21 сентября 2010

Я добавил полнотекстовый поиск в свою экспресс-базу данных sql server 2008 и создал каталог индексов для двух столбцов в одной таблице.Итак, теперь я должен переписать одну из моих хранимых процедур, но я не знаю, с чего начать.Ниже приводится мой текущий SP, который мне нужно преобразовать, чтобы воспользоваться возможностями полнотекстового поиска:

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

Не могли бы кто-нибудь объяснить, как я выполняю эту задачу?Я использую CONTAINS или FREETEXT и где я могу их добавить.Я просто потерян на этом?Спасибо!

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

ОК, вот что я сделал, чтобы все заработало.Причина, по которой я получал сообщение с шумовым словом, заключается в том, что я неправильно установил значение параметра length @search.Как только я это понял и изменил, все работает отлично.

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 голос
/ 21 сентября 2010

Использование:

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)

Жаль, что у вас есть разные параметры для поиска полей заголовка и содержимого - мог бы быть объединен в одно СОДЕРЖАНИЕ, если параметры имеют одинаковое значение .

Документация содержит подробное описание того, когда они предлагают функциональность полнотекстового поиска (FTS) .Большинство примеров предлагают CONTAINS / CONTAINSTABLE и используют FREETEXT / FREETEXTTABLE для:

  • Флективные формы - это различные времена глагола или формы единственного и множественного числа существительного.
  • Тезаурус определяет пользовательские синонимы для терминов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...