将用户搜索关键字与标签匹配

时间:2009-10-16 08:39:32

标签: database tsql full-text-search tags

有人可以提出建议吗,如何将用户输入(几个单词)与系统中的相应标签相匹配(每个还有1个或N个单词)?

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

Object                  Tags
Earth                   World, reality
World of warcraft 3     World Of warcraft, virtual reality
quake                   game, virtual

我想得到以下内容:

用户输入“世界”:结果为“地球

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

这很简单,精确搜索。但是:

用户输入'游戏世界':结果应按两个标签搜索 - “地球”,“地震

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

用户输入'虚拟现实':地球,地震

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

更新1 首先我要做的是禁止标签中的空格,比如stackoverflow。任何其他想法都会被提升。

3 个答案:

答案 0 :(得分:3)

您可能希望使用Velocity缓存引擎进行调查,因为它非常支持标记(GetObjectsByTagGetObjectsByAllTagsGetObjectsByAnyTag)以及所有的努力工作已经为你完成了!您所要做的就是使用适当的标记将对象加载到缓存中。

答案 1 :(得分:1)

您需要使用拆分功能在搜索字符串中拆分标记,然后尝试在标记中匹配这些标记

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 + '%'

类似的东西。

答案 2 :(得分:0)

将这种复杂的业务逻辑放入SQL代码中并不是一个好主意!把它放在中间层,如果你担心性能,可以使用一些缓存机制。