SQL Search/Compare 关键字和 Orderby 相似度
SQL Search/Compare Keywords and Orderby similarity
我接到了这个挑战,要根据页面的关键字做一个相关的页面显示。
应用程序应该根据用户正在访问的当前页面的关键字显示相关页面。它将检查页面当前具有的关键字字符串,例如它有 3 个关键字
"Tag,Keyword,Test"
它应该检查数据库中的其他页面是否有相同的关键字。例如,结果将是另外 2 个页面,其中包含一些关键字(不是全部)
PageName | Keyword
Subpage1| Test,Tag
Subpage2| Tag
我也想按相关性排序,匹配的关键词越多相关性越高。
试试这个
函数
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
查询
declare @keyword nvarchar(max) = 'tag,test'
select tabl1.pageName,table1.Keyword,count(keywordname.value) as MatchCount
from table1 inner join
(select value from fn_Split(@keyword,',')) as keywordname on
table1.keyword like '%'+keywordname.value+'%'
group by tabl1.pageName,table1.Keyword
order by MatchCount desc
您可以使用 CTE
和 Split
函数使用 Cross Apply
;WITH CtePrimary AS(
SELECT
LTRIM(RTRIM(s.Data)) AS Keyword,PageName
FROM PageKeywords k
CROSS APPLY dbo.Split(k.Primary_Kwd, ",") s
),CteSecondry as (
select Distinct PageName,
STUFF(
(SELECT ', ' + convert(varchar(10), t2.keywords, 120)
FROM CtePrimary t2
where t1.PageName
= t2.PageName
FOR XML PATH (''))
, 1, 1, '') AS Keywords
,Count(distinct Keywords) AS KeyCount
from CtePrimary t1 where Keyword In (select Data From dbo.Split(@keywords,',' )) )
select PageName,Keywords from CteSecondry order by KeyCount desc
我接到了这个挑战,要根据页面的关键字做一个相关的页面显示。
应用程序应该根据用户正在访问的当前页面的关键字显示相关页面。它将检查页面当前具有的关键字字符串,例如它有 3 个关键字
"Tag,Keyword,Test"
它应该检查数据库中的其他页面是否有相同的关键字。例如,结果将是另外 2 个页面,其中包含一些关键字(不是全部)
PageName | Keyword
Subpage1| Test,Tag
Subpage2| Tag
我也想按相关性排序,匹配的关键词越多相关性越高。
试试这个
函数
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
查询
declare @keyword nvarchar(max) = 'tag,test'
select tabl1.pageName,table1.Keyword,count(keywordname.value) as MatchCount
from table1 inner join
(select value from fn_Split(@keyword,',')) as keywordname on
table1.keyword like '%'+keywordname.value+'%'
group by tabl1.pageName,table1.Keyword
order by MatchCount desc
您可以使用 CTE
和 Split
函数使用 Cross Apply
;WITH CtePrimary AS(
SELECT
LTRIM(RTRIM(s.Data)) AS Keyword,PageName
FROM PageKeywords k
CROSS APPLY dbo.Split(k.Primary_Kwd, ",") s
),CteSecondry as (
select Distinct PageName,
STUFF(
(SELECT ', ' + convert(varchar(10), t2.keywords, 120)
FROM CtePrimary t2
where t1.PageName
= t2.PageName
FOR XML PATH (''))
, 1, 1, '') AS Keywords
,Count(distinct Keywords) AS KeyCount
from CtePrimary t1 where Keyword In (select Data From dbo.Split(@keywords,',' )) )
select PageName,Keywords from CteSecondry order by KeyCount desc