sql-server - 忽略 SQL Server 中全文搜索 (FREETEXTTABLE) 搜索列中的破折号 (-)

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

我将 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 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查询失败。

关于sql-server - 忽略 SQL Server 中全文搜索 (FREETEXTTABLE) 搜索列中的破折号 (-),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532557/

相关文章:

sql-server - SQL Server FileStream 中的缓冲池

sql-server - ssis中如何将空白转换为null

sql-server - 为什么在使用 XQuery 时执行计划中有排序

mysql - 在mysql全文搜索中给一些字段更多的相关性并按相关性排序

带有 Sequelize 的 MySQL 全文搜索

c# - 如何将使用 SqlServer 作为数据库服务器的应用程序部署到 Azure Batch

sql - 我该怎么做 Pivot(转置)

c# - 在 SQL 代理作业中运行 C# 代码

mysql - 列出由 Innodb 全文索引的单词

tsql - 解析单列表中的列和数据