【问题标题】:Escaping Bracket [ in a CONTAINS() clause?转义括号 [ 在 CONTAINS() 子句中?
【发布时间】:2008-11-26 04:15:42
【问题描述】:

如何在全文 SQL Server contains() 查询中转义括号?我已经尝试了以下所有方法,没有其中的工作:

CONTAINS(crev.RawText, 'arg[0]')
CONTAINS(crev.RawText, 'arg[[0]]')
CONTAINS(crev.RawText, 'arg\[0\]')

使用双引号确实有效,但它将整个搜索强制为一个短语,这对于多个单词查询来说是一个阻碍。

CONTAINS(crev.RawText, '"arg[0]"')

我真正想做的就是逃避括号,但我似乎做不到..

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您不必转义 [,因为它在全文搜索中没有特殊含义。如果您确实需要搜索完全匹配,则可以使用“”标记。

    此外,您可以在单引号内使用多个“”:

    CONTAINS('"word1" or "word2" or "word3"')
    

    这也有效:

    CONTAINS('"word1" and "word2" and "word3"')
    

    双引号内的任何内容都被视为精确文本。因此,如果我要在 AdventureWorks 中搜索 Production.ProductDescription 表的 Description 字段,我可以使用

    CONTAINS('shifting and "on or off-road"') 
    

    它会找到与“on or off-road”这个词组相匹配的单词 shift。

    唯一的特殊符号是~,它可以用来代替NEAR 命令。

    CONTAINS('shifting ~ smooth')
    

    一样
    CONTAINS('shifting NEAR smooth')
    

    并且会在单词 shift 和 smooth 彼此靠近的地方找到匹配项。

    【讨论】:

    • 这是正确的,但您必须转义括号(或将其放在多个 AND 或 OR 分隔的引号中,如您所示) - 包括引号外的括号会产生错误。
    • 所以只是为了 100% 清楚,这是有效的:CONTAINS(field, 'value AND "value[0]"'),但这不是:CONTAINS(field, 'value "value[0]"')。您必须明确包含布尔子句
    • SELECT * FROM dbo.stackoverflow_319730 WHERE CONTAINS(txtcol, '"arg[0]" AND "arg[1]"') 在我的测试数据中仍然匹配 arg[0]。跨度>
    【解决方案2】:

    显然不符合全文索引的精神。

    单词

    是一串没有的字符 空格或标点符号。

    短语

    是一个或多个带空格的单词 每个单词之间。

    标点符号被忽略。所以, 包含(测试,“计算机故障”) 匹配具有值的行,“哪里 是我的电脑吗?找不到它 会很贵。”

    我不确定你的选择是什么。

    显然LIKE 工作正常:

    SELECT *
    FROM dbo.stackoverflow_319730
    WHERE txtcol LIKE 'arg[ [ ]0]'
    

    但是

    SELECT *
    FROM dbo.stackoverflow_319730
    WHERE CONTAINS(txtcol, '"arg[0]"')
    

    甚至匹配包含'arg[1]' 的列,例如:

    CREATE TABLE [dbo].[stackoverflow_319730](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [txtcol] [text] NOT NULL,
     CONSTRAINT [PK_stackoverflow_319730] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[0]')
    INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[1]')
    INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('some other text')
    INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[0], arg[1]')
    
    EXEC sp_fulltext_catalog   'FTCatalog','create'
    EXEC sp_fulltext_table     'stackoverflow_319730', 'create', 'FTCatalog', 'pk_stackoverflow_319730' 
    EXEC sp_fulltext_column    'stackoverflow_319730', 'txtcol', 'add' 
    EXEC sp_fulltext_table     'stackoverflow_319730','activate' 
    EXEC sp_fulltext_catalog   'FTCatalog', 'start_full' 
    
    SELECT *
    FROM dbo.stackoverflow_319730
    WHERE txtcol LIKE 'arg[ [ ]0]'
    
    SELECT *
    FROM dbo.stackoverflow_319730
    WHERE CONTAINS(txtcol, '"arg[0]"')
    

    结果表明标点符号存在问题:

    id          txtcol
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           arg[0]
    
    (1 row(s) affected)
    
    id          txtcol
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           arg[0]
    2           arg[1]
    4           arg[0], arg[1]
    Informational: The full-text search condition contained noise word(s).
    

    【讨论】:

    • 全文搜索条件 'arg[ [ ]0]' 中 '[' 附近的语法错误。
    • 在该语句中 [ ] ] 之间有空格,删除所有空格后会发生什么?
    • 全文搜索条件'arg[[]0]'中'['附近的语法错误
    猜你喜欢
    • 2015-09-25
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2011-06-13
    相关资源
    最近更新 更多