【问题标题】:SQL Search Problem With New SearchContent Function新 SearchContent 函数的 SQL 搜索问题
【发布时间】:2010-10-28 00:18:12
【问题描述】:

我有一个关于在 SQL 中搜索的问题。我们在下面有一段代码负责在我们的网站内搜索一组内容。当我们编写 StaticContent 算法时,它运行良好。添加 ContribContent(第 2 和第 4 标准杆)后,它似乎不起作用。你知道为什么吗?

非常感谢!

ALTER PROCEDURE [dbo].[SearchContent]
    @PageNumber tinyint,
    @ResultsPerPage tinyint,
    @HowManyResults smallint output,
    @AllWords bit,
    @Word1 varchar(15) = null,
    @Word2 varchar(15) = null,
    @Word3 varchar(15) = null,
    @Word4 varchar(15) = null,
    @Word5 varchar(15) = null
    AS
    BEGIN
    DECLARE @Content TABLE
    (RowNumber smallint IDENTITY (1,1) NOT NULL,
    ContentID int,
    Title varchar(50),
    UserID int,
    Summary text,
    FirstName varchar(50),
    LastName varchar(50),
    Picture varchar(100),
    Type varchar(50),
    Rank int
)

IF @AllWords = 0
INSERT INTO @Content
SELECT ContribContent.ContentID, ContribContent.Title, ContribContent.UserID,
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Contributed Content' AS Type,
3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article) +
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) +
3 * dbo.WordCount(@Word3, Title) + dbo.WordCount(@Word3, Article) +
3 * dbo.WordCount(@Word4, Title) + dbo.WordCount(@Word4, Article) +
3 * dbo.WordCount(@Word5, Title) + dbo.WordCount(@Word5, Article)
AS Rank
FROM ContribContent
INNER JOIN Users
ON ContribContent.UserID = Users.UserID
ORDER BY Rank DESC

IF @AllWords = 0
INSERT INTO @Content
SELECT StaticContent.ContentID, StaticContent.Title, StaticContent.UserID,
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Static Content' AS Type,
3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article) +
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article) +
3 * dbo.WordCount(@Word3, Title) + dbo.WordCount(@Word3, Article) +
3 * dbo.WordCount(@Word4, Title) + dbo.WordCount(@Word4, Article) +
3 * dbo.WordCount(@Word5, Title) + dbo.WordCount(@Word5, Article)
AS Rank
FROM StaticContent
INNER JOIN Users
ON StaticContent.UserID = Users.UserID
ORDER BY Rank DESC

IF @AllWords = 1
INSERT INTO @Content
SELECT ContribContent.ContentID, ContribContent.Title, ContribContent.UserID,
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Contributed Content' AS Type,
(3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) *
CASE
WHEN @Word2 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word3 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word4 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word5 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END
AS Rank
FROM ContribContent
INNER JOIN Users
ON ContribContent.UserID = Users.UserID
ORDER BY Rank DESC

IF @AllWords = 1
INSERT INTO @Content
SELECT StaticContent.ContentID, StaticContent.Title, StaticContent.UserID,
SUBSTRING(Article, 1, 300) + '...' AS Summary, Users.FirstName, Users.LastName, Users.Picture, 'Static Content' AS Type,
(3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) *
CASE
WHEN @Word2 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word3 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word4 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END *
CASE
WHEN @Word5 IS NULL THEN 1
ELSE
3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
END
AS Rank
FROM StaticContent
INNER JOIN Users
ON StaticContent.UserID = Users.UserID
ORDER BY Rank DESC

SELECT @HowManyResults = Count(*)
FROM @Content
WHERE Rank > 0

SELECT ContentID, Title, Title, UserID, Summary, FirstName, LastName, Picture, Type, Rank
FROM @Content
WHERE Rank > 0 AND RowNumber BETWEEN (@PageNumber-1) * @ResultsPerPage+1 AND @PageNumber * @ResultsPerPage
ORDER BY Rank DESC
END

【问题讨论】:

  • “它似乎不起作用” - 实际问题是什么?
  • 好吧,它不能像使用静态那样正确搜索。搜索时,它将正确返回 StaticContent,但 ContribContent 没有任何内容
  • 这个SP,它到底是做什么的?
  • 此存储过程旨在搜索信息网站上的内容,其中涉及三个数据表:StaticContent(由我们的内容团队编写)、ContribContent(由其他人编写)和 Users(任何类型的内容与提交它的用户相关联)该过程旨在搜索内容并返回与搜索词匹配的内容并根据相关性对其进行排名,它还将返回返回的内容条数。目前它会很好地返回静态内容,但不会返回贡献的内容

标签: c# sql search


【解决方案1】:

我不是数据库专家,但有时它会有所帮助。

例如,ContribContent 的第二部分显示如下(我重新格式化了):

IF @AllWords = 1
INSERT INTO @Content
SELECT 
    ContribContent.ContentID, 
    ContribContent.Title, 
    ContribContent.UserID,
    SUBSTRING(Article, 1, 300) + '...' AS Summary, 
    Users.FirstName, 
    Users.LastName, 
    Users.Picture, 
    'Contributed Content' AS Type,
    (
        (3 * dbo.WordCount(@Word1, Title) + dbo.WordCount(@Word1, Article)) *

        CASE 
            WHEN @Word2 IS NULL THEN 1
        ELSE
            3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
        END 

        *

        CASE 
            WHEN @Word3 IS NULL THEN 1
        ELSE
            3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
        END 

        *

        CASE
            WHEN @Word4 IS NULL THEN 1
        ELSE
            3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
        END 

        *

        CASE
            WHEN @Word5 IS NULL THEN 1
        ELSE
            3 * dbo.WordCount(@Word2, Title) + dbo.WordCount(@Word2, Article)
        END
    ) AS Rank
FROM ContribContent
INNER JOIN Users ON ContribContent.UserID = Users.UserID
ORDER BY Rank DESC

在每次插入后,我建议对@Content 执行 PRINT 或 SELECT。这将告诉您在调试过程的每个阶段之后数据是如何留下的。有时,如果您正在执行 INNER JOIN 的表不正确匹配(即 Null 或缺失值),则不会返回预期的数据。此外,每当处理可能的空值时,我都喜欢输出各种测试数据及其结果,以确保它们按照我的意图进行(例如,CASE 结构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多