【问题标题】:Optimizing an SQL search using a column for keywords and a variable as the text to be searched使用关键字列和变量作为要搜索的文本来优化 SQL 搜索
【发布时间】:2011-12-26 10:06:21
【问题描述】:

这是我的困惑。我有一个包含一段文本的变量,并且有一列充满了关键字。我想根据我的变量中包含的整个文本搜索列中包含的每个关键字。

我知道如何做到这一点的唯一方法是一次选择一列的每一行,然后在每一侧使用带有通配符的 LIKE 运算符来查看列中的关键字是否在变量中的文本。我尝试这样做的每一种方法最终都显得效率极低。

另一种看待这个问题的方式是,如果我可以颠倒诸如 FREETEXT 之类的运算符的顺序以执行诸如 FREETEXT(@input, keywords) 之类的操作,那就太棒了。但我似乎无法想出一种方法来像那样简单有效地做到这一点。

关于如何尽可能高效地执行此操作的任何提示?非常感谢您的帮助!

编辑:

这是我的存储过程,供参考:

GO
    @input varchar(1000),
    @debug varchar(25) output

AS
BEGIN

    SELECT TOP 1 @debug = kw.keyword
    FROM (SELECT @input input) bigstring
    INNER JOIN table1 kw 
    on bigstring.input LIKE '%' + kw.keyword + '%'

END

【问题讨论】:

    标签: sql search full-text-search contains freetext


    【解决方案1】:

    这里有两种方法,具体取决于您要做什么(假设 SQL 2005+ 来自 FREETEXT 关键字)。示例数据之后的第一个选择返回关键字的索引(如果您不想要找不到的关键字,请过滤掉零)。第二个只是检查是否存在

    Declare @keywords  as table (keyword varchar(50))
    INSERT INTO @keywords 
    VALUES ('quandary'),
           ('variable'),
           ('paragraph'),
           ('Narwhal')
    
    
    DECLARE @input as varchar(max)
    SET @input = 'Heres my quandary. I have a variable that contains a paragraph of text, and I have a column full of keywords. I want to search each of the keywords contained in the column against the entirety of the text contained within my variable'
    
    
    SELECT keyword, CHARINDEX(keyword, @input , 0)
    FROM @keywords
    
    SELECT kw.keyword
    FROM 
    (SELECT @input input) bigstring
    INNER JOIN @keywords kw 
    on bigstring.input like '%' + kw.keyword + '%'
    
    
    
    (4 row(s) affected)
    keyword                                            
    ----------------------- --------------------
    quandary                10
    variable                29
    paragraph               54
    Narwhal                 0
    
    (4 row(s) affected)
    
    keyword
    -----------------------
    quandary
    variable
    paragraph
    
    (3 row(s) affected)
    

    如果也有 CROSS APPLY 解决方案,我不会感到惊讶

    更新 仅将第一个关键字作为输出参数输出

    数据

    CREATE TABLE table1 (keyword varchar(50))
    INSERT INTO table1 
    VALUES ('quandary'),
           ('variable'),
           ('paragraph'),
           ('Narwhal')
    
    GO
    

    过程

    CREATE  proc testKeyword
            @input varchar(1000),
            @debug varchar(25) output
    
        AS
        BEGIN
    
            SELECT TOP 1 @debug = kw.keyword
            FROM (SELECT @input input) bigstring
            INNER JOIN table1 kw 
            on bigstring.input LIKE '%' + kw.keyword + '%'
    
        END
    

    测试

    DECLARE @debug varchar(25)
    EXEC testKeyword 'Heres my quandary. I have a variable that contains a paragraph of text, and I have a column full of keywords. I want to search each of the keywords contained in the column against the entirety of the text contained within my variable',
               @debug out 
    
    SELECT @debug 
    
    outputs 
    
    
    -------------------------
    quandary
    
    (1 row(s) affected)
    

    【讨论】:

    • 输入变量和关键字表的类型是什么?另外“不起作用”是什么意思,例如没有记录,错误?
    • 第二个查询看起来很棒,当我按照你写的那样执行它时,它工作正常,但是当我将它放入我的存储过程并从外部源传递输入变量时,它不起作用。如果输入变量不是直接在 select 语句上方进行硬编码,我是否需要调整输入变量的处理方式?这是我转储到 SP 中的代码,试图将调试变量设置为第一个找到的关键字:SELECT TOP 1 @debug = kw.location FROM (SELECT @input input) bigstring INNER JOIN table1 kw on bigstring.input like '%' + kw.location + '%'
    • By 不起作用,我的意思是当我使用完全相同的输入和关键字将代码粘贴到我的存储过程中时,它永远不会找到匹配项。我希望这是有道理的?不过没有错误。
    • 如果我粘贴我的 SP 可能会有所帮助...我现在将其添加到我的 OP 中。
    • 如果我使用SELECT @debug = count(kw.keyword),它会像我预期的那样工作......所以也许我在它的顶部做错了什么?但它在存储过程之外工作,所以我真的迷路了。
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2011-01-29
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多