代码之家  ›  专栏  ›  技术社区  ›  Jeff Atwood

转义括号[在CONTAINS()子句中]?

  •  10
  • Jeff Atwood  · 技术社区  · 17 年前

    contains() 查询我已经尝试了以下所有方法, 没有一个 其中:

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

    使用双引号确实有效,但是 ,这是一个用于多词查询的showstopper。

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

    我真正想做的就是逃离这个圈子,但我似乎做不到。。

    2 回复  |  直到 17 年前
        1
  •  8
  •   Jeff Atwood    17 年前

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

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

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

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

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

    它会找到与单词移位相匹配的词,这个词也有“在路上或越野”这个短语。

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

    CONTAINS('shifting ~ smooth')
    

    CONTAINS('shifting NEAR smooth')
    

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

        2
  •  2
  •   Cade Roux    17 年前

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

    是一个不带字符的字符串 空格或标点符号。

    字里行间。

    标点符号被忽略。因此 包含(测试,“计算机故障”) 会很贵。”

    明显地 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).