【问题标题】:Ignore Dash (-) from Full Text Search (FREETEXTTABLE) search column in SQL Server忽略 SQL Server 中全文搜索 (FREETEXTTABLE) 搜索列中的短划线 (-)
【发布时间】:2017-11-28 13:16:46
【问题描述】:

我使用CONTAINSTABLE 作为我的搜索算法。我想在特定列值中忽略破折号来搜索列值。例如,列包含“12345-67”,则应使用“1234567”进行搜索,如下查询。

SELECT * 
FROM table1 AS FT_Table
INNER JOIN CONTAINSTABLE(table2, columnname, '1234567') AS Key_Table ON FT_Table.ID = Key_Table.[Key]

在搜索不包含破折号 (-) 的字符串时,有什么方法可以忽略破折号 (-)?

【问题讨论】:

    标签: sql-server full-text-search sql-server-2014 containstable freetexttable


    【解决方案1】:

    我做了一些挖掘工作,花了几个小时 :) 不幸的是,没有办法执行它。看起来 Sql Server FTS 通过破坏单词(空格除外)以及特殊字符(-、{、(等)来填充单词 但它并没有填充完整的单词,我的理解是没有办法提供一些填充规则来满足需要。 (我的意思是,告诉人口服务,如果单词包含“-”,请将其替换为“”。) 我提供了一个例子来说明情况。

    首先,创建表格、FTS 目录、全文索引并为表格插入示例行。

    CREATE TABLE [dbo].[SampleTextData] 
    (
      [Id] int identity(1,1) not null,
      [Text] varchar(max) not null,
      CONSTRAINT [PK_SampleTextData] PRIMARY KEY CLUSTERED 
      (
            [Id] ASC
      )
    );  
    CREATE FULLTEXT CATALOG ftCatalog AS DEFAULT;  
    CREATE FULLTEXT INDEX ON SampleTextData
    (Text)
    KEY INDEX PK_SampleTextData
    ON ft 
    
    INSERT INTO [SampleTextData] values ('samp-le text')
    

    然后,提供示例查询;

    select * from containstable(SampleTextData,Text,'samp-le') --Success
    
    select * from containstable(SampleTextData,Text,'samp') --Success
    
    select * from containstable(SampleTextData,Text,'le') --Success
    
    select * from containstable(SampleTextData,Text,'sample') -- Fail
    

    除了一个“Samp-le”之外,这些样本都是成功的。要调查情况,请执行此查询;

    SELECT display_term, column_id, document_count
    FROM sys.dm_fts_index_keywords (DB_ID('YourDatabase'), OBJECT_ID('SampleTextData')) 
    

    输出:

    le          2   1
    samp        2   1
    samp-le     2   1
    text        2   1
    END OF FILE 2   1
    

    查询为我们提供了由 FTS 人口服务填充的单词结果。如您所见,总体结果包含 'le'、'samp'、'samp-le' 但不包含 'sample'。这就是sample 查询失败的原因。

    【讨论】:

    • 感谢您的回复。我们尝试了这个解决方案,但似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多