我使用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]
在使用不包含短划线( - )的字符串进行搜索时,有没有办法忽略破折号( - )?
答案 0 :(得分: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
查询失败的原因。