Database 用户搜索关键字与标记的匹配
是否有人能提出建议,如何将用户输入(几个单词)与系统中的适当标记相匹配(每个标记也有1个或N个单词) 以下是演示问题的示例: 我有一个标签,分配给对象。例如(标记由COMA分隔,但在现实生活中我与表有关系) 我想得到以下信息: 用户输入“World”:结果是“Earth” 用户输入“魔兽世界””:结果是“魔兽世界3” 这是一个简单、准确的搜索。但是: 用户进入“游戏世界”:搜索结果时应使用两个标签-“地球”、“地震” 用户输入“虚拟现实””:返回所有3条记录 用户输入“虚拟现实”:地球、地震 我使用t-sql进行搜索,全文搜索已启用,并用于在主文本中查找关键字。C#是中层。但我更喜欢t-sql级别的解决方案 更新1Database 用户搜索关键字与标记的匹配,database,tsql,full-text-search,tags,Database,Tsql,Full Text Search,Tags,是否有人能提出建议,如何将用户输入(几个单词)与系统中的适当标记相匹配(每个标记也有1个或N个单词) 以下是演示问题的示例: 我有一个标签,分配给对象。例如(标记由COMA分隔,但在现实生活中我与表有关系) 我想得到以下信息: 用户输入“World”:结果是“Earth” 用户输入“魔兽世界””:结果是“魔兽世界3” 这是一个简单、准确的搜索。但是: 用户进入“游戏世界”:搜索结果时应使用两个标签-“地球”、“地震” 用户输入“虚拟现实””:返回所有3条记录 用户输入“虚拟现实”:地球、地震 我
首先,我要做的是,不允许在标记中使用空格,比如在stackoverflow上。任何其他想法都值得赞赏。将如此复杂的业务逻辑放入SQL代码中不是一个好主意!把它放在中间层,如果你担心性能,使用一些缓存机制。 < P> >把这样复杂的业务逻辑放到SQL代码中不是一个好主意!把它放在中间层,如果你担心性能,使用一些缓存机制。你需要一个分割函数来分割搜索字符串中的标签,然后尝试在标签中匹配这些标签。
FUNCTION [dbo].[SplitString]
(
@String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
)
RETURNS @RetTable TABLE(
String varchar(1000)
)
AS
BEGIN
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
RETURN
END
DECLARE @String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
DECLARE @RetTable TABLE(
String varchar(1000)
)
SELECT @String = 'world of ',
@Delimiter = ' '
--split FUNCTION that returns a table of tags to match
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
PRINT @i
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
SELECT * FROM @RetTable
--split FUNCTION that returns a table of tags to match
DECLARE @Table TABLE(
Objects VARCHAR(MAX),
Tags VARCHAR(MAX)
)
INSERT INTO @Table (Objects,Tags) SELECT 'Earth', 'World,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'World of warcraft 3', 'World Of warcraft,virtual,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'quake', 'game,virtual'
SELECT DISTINCT
t.*
FROM @Table t,
@RetTable r
WHERE Tags LIKE '%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%'
函数[dbo].[SplitString]
(
@字符串VARCHAR(8000),
@分隔符VARCHAR(10)
)
返回@RetTable表(
字符串varchar(1000)
)
作为
开始
声明@i INT,
@j INT
选择@i=1
而@i则需要一个split函数来拆分搜索字符串中的标记,然后尝试在标记中匹配这些标记
FUNCTION [dbo].[SplitString]
(
@String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
)
RETURNS @RetTable TABLE(
String varchar(1000)
)
AS
BEGIN
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
RETURN
END
DECLARE @String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
DECLARE @RetTable TABLE(
String varchar(1000)
)
SELECT @String = 'world of ',
@Delimiter = ' '
--split FUNCTION that returns a table of tags to match
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
PRINT @i
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
SELECT * FROM @RetTable
--split FUNCTION that returns a table of tags to match
DECLARE @Table TABLE(
Objects VARCHAR(MAX),
Tags VARCHAR(MAX)
)
INSERT INTO @Table (Objects,Tags) SELECT 'Earth', 'World,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'World of warcraft 3', 'World Of warcraft,virtual,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'quake', 'game,virtual'
SELECT DISTINCT
t.*
FROM @Table t,
@RetTable r
WHERE Tags LIKE '%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%'
函数[dbo].[SplitString]
(
@字符串VARCHAR(8000),
@分隔符VARCHAR(10)
)
返回@RetTable表(
字符串varchar(1000)
)
作为
开始
声明@i INT,
@j INT
选择@i=1
虽然@i您可能希望研究使用缓存引擎,因为它对标记(,)有非常丰富的支持,并且所有的艰苦工作都已经为您完成了!您所要做的就是使用适当的标记将对象加载到缓存中。您可能需要研究使用缓存引擎,因为它对标记(,)有非常丰富的支持,并且所有的艰苦工作都已经为您完成!你所要做的就是用适当的标记将对象加载到缓存中。好的一点。然而,我担心在C#level中将所有关键字组合与标记匹配会很慢。事实恰恰相反。除非你有大量的关键字(>100MB),否则你不需要全文索引。你也可以用嵌套的hashtable/dictionnaries实现c#索引。不过,除非你的数据库是唯一的,否则你实际上可以使用c#代码拥有多个服务器。。。这里有自然的平行性!说得好。然而,我担心在C#level中将所有关键字组合与标记匹配会很慢。事实恰恰相反。除非你有大量的关键字(>100MB),否则你不需要全文索引。你也可以用嵌套的hashtable/dictionnaries实现c#索引。不过,除非你的数据库是唯一的,否则你实际上可以使用c#代码拥有多个服务器。。。这里有自然的平行性!谢谢你的链接,我不知道。我一定会检查的。然而,这只是我搜索问题的一部分,我使用第三方的可能性很低。这取决于你如何解释第三方。如果你已经在使用C#,那么它只是微软的另一个组件。谢谢你的链接,我不知道。我一定会检查的。然而,这只是我搜索问题的一部分,我使用第三方的可能性很低。这取决于你如何解释第三方。如果您已经在使用C#,那么它只是Microsoft的另一个组件。