【问题标题】:SQL Server 2008 FullText Search QuerySQL Server 2008 全文搜索查询
【发布时间】:2010-09-20 20:22:50
【问题描述】:

我已将全文搜索添加到我的 sql server 2008 express 数据库中,并为单个表中的两列创建了索引目录。所以现在,我必须重写我的一个存储过程,但我不知道从哪里开始。以下是我当前需要转换以利用全文搜索功能的 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 以及在哪里添加它。我只是迷路了?谢谢!

【问题讨论】:

  • 你为什么要对所有这些帖子进行分组?
  • 您需要修改那些包含like 语句的谓词并在其中包含contains,如果您想利用加速查询并且您可能希望将这些like 语句保留在以防万一您想要更精确的结果。

标签: sql sql-server tsql sql-server-2008 full-text-search


【解决方案1】:

用途:

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)

很遗憾,您在搜索标题和内容字段时使用了不同的参数 - could've been consolidated into a single CONTAINS if the parameters are the same value

documentation provides a nice breakdown of when they suggest Full Text Search (FTS) functionality。大多数示例建议使用 CONTAINS/CONTAINSTABLE,并将 FREETEXT/FREETEXTTABLE 用于:

  • 屈折形式是动词的不同时态或名词的单复数形式。
  • 词库定义了用户指定的术语同义词。

【讨论】:

  • 好的,我使用单个参数修改了查询,如下所示,但它不起作用。我收到一条消息说有干扰词。
  • ALTER PROCEDURE [dbo].[sp_page_GetPostsByFTS] (@search nvarchar, @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帖子 WHERE CONTAINS((Title, Content), @search) ) as u WHERE u.RowNumber > @startRowIndex AND u.RowNumber
  • @Scott W.:这是您的 FTS 存在的问题,需要您使用 tune the noise wordsencapsulate the results of the parameters (@Tile, @Content) inside of double quotes
【解决方案2】:

好的,这就是我为使它工作所做的工作。我收到噪音词消息的原因是因为我没有正确设置参数值长度@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

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多