Database 用户搜索关键字与标记的匹配

Database 用户搜索关键字与标记的匹配,database,tsql,full-text-search,tags,Database,Tsql,Full Text Search,Tags,是否有人能提出建议,如何将用户输入(几个单词)与系统中的适当标记相匹配(每个标记也有1个或N个单词) 以下是演示问题的示例: 我有一个标签,分配给对象。例如(标记由COMA分隔,但在现实生活中我与表有关系) 我想得到以下信息: 用户输入“World”:结果是“Earth” 用户输入“魔兽世界””:结果是“魔兽世界3” 这是一个简单、准确的搜索。但是: 用户进入“游戏世界”:搜索结果时应使用两个标签-“地球”、“地震” 用户输入“虚拟现实””:返回所有3条记录 用户输入“虚拟现实”:地球、地震 我

是否有人能提出建议,如何将用户输入(几个单词)与系统中的适当标记相匹配(每个标记也有1个或N个单词)

以下是演示问题的示例: 我有一个标签,分配给对象。例如(标记由COMA分隔,但在现实生活中我与表有关系)

我想得到以下信息:

用户输入“World”:结果是“Earth

用户输入“魔兽世界””:结果是“魔兽世界3

这是一个简单、准确的搜索。但是:

用户进入“游戏世界”:搜索结果时应使用两个标签-“地球”、“地震

用户输入“虚拟现实””:返回所有3条记录

用户输入“虚拟现实”地球、地震

我使用t-sql进行搜索,全文搜索已启用,并用于在主文本中查找关键字。C#是中层。但我更喜欢t-sql级别的解决方案

更新1
首先,我要做的是,不允许在标记中使用空格,比如在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的另一个组件。