4

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]

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

4

1 回答 1

2

我做了一些挖掘并花了几个小时的时间:) 不幸的是,没有办法执行它。看起来 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查询失败的原因。

于 2017-11-28T13:34:52.660 回答