&符号(&)
有问题如何搜索包含&符号(&)的单词(或句子)。
例如,在数据库中是:
1: "Johnson & Johnson"
2: "AT&T"
3: "Sample & Sample"
如何编写全文搜索查询以搜索单个记录?
SELECT * from Companies c WHERE CONTAINS(c.CompanyName, '"AT&T"')
我知道字符(&)负责逻辑AND操作。但我不知道如何使用全文搜索将其编码为文本搜索。
有什么想法吗?
答案 0 :(得分:7)
简短版本:您不能(或者至少可以,但您可能会获得比预期更多的结果)
长版本:字符'&'
被视为“断字符”,即当SQL Server遇到'&'
时,它会将其视为新的开头“单词“(即令牌)。解析"AT&T"
时SQL Server看到的是两个令牌,"AT"
和"T"
。
您可以使用sys.dm_fts_parser
SELECT * FROM sys.dm_fts_parser('AT&T', 1033, 0, 0)
keyword group_id phrase_id occurrence special_term display_term expansion_type source_term
----------- ----------- ----------- ----------- ------------- ------------- -------------- -----------
0x00610074 1 0 1 Noise Word at 0 AT
0x0074 2 0 1 Noise Word t 0 T
这意味着搜索"AT&T"
几乎与搜索"AT T"
完全相同。
这是设计的,据我所知,修改此行为的唯一方法是安装自己的word breaker,但这不是我建议做的事情。
答案 1 :(得分:3)
接受的答案不是完全正确。将搜索项括在双引号中会使单词分组成为“短语”匹配。在这种情况下,ampsersand(&
)可以被视为文字字符,例如当被一个或多个不形成已知单词的字母包围时。只需查看您的"AT&T"
示例,我们就会看到:
DECLARE @Term NVARCHAR(100);
SET @Term = N'"AT&T"';
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1);
GO
返回:
keyword group phrase occurrence special display expansion source
id id term term type term
0x0061007400260074 1 0 1 Exact Match at&t 0 AT&T
正如你所看到的,&符号根本没有问题,只要它用你已经在做的双引号("
)括起来,哇哇!
但是,这对于"Johnson & Johnson"
示例来说并不干净:
DECLARE @Term NVARCHAR(100);
SET @Term = N'"Johnson & Johnson"';
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1);
GO
返回:
keyword group phrase occurrence special display expansion source
id id term term type term
0x006A006F0068006E0073006F006E 1 0 1 Exact Match johnson 0 Johnson & Johnson
0x006A006F0068006E0073006F006E 1 0 2 Exact Match johnson 0 Johnson & Johnson
这似乎也匹配Johnson Johnson
的搜索字词,这在技术上并不正确。
因此,除了用双引号括起来之外,您还可以将&符号转换为下划线(_
),其处理方式不同:
DECLARE @Term NVARCHAR(100);
SET @Term = N'"Johnson _ Johnson"';
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1);
GO
返回:
keyword group phrase occurrence special display expansion source
id id term term type term
0x006A006F0068006E0073006F006E 1 0 1 Exact Match johnson 0 Johnson _ Johnson
0x005F 1 0 2 Exact Match _ 0 Johnson _ Johnson
0x006A006F0068006E0073006F006E 1 0 3 Exact Match johnson 0 Johnson _ Johnson
并且,执行该字符翻译似乎不会对原始"AT&T"
搜索产生负面影响:
DECLARE @Term NVARCHAR(100);
SET @Term = N'"AT_T"';
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1);
返回:
keyword group phrase occurrence special display expansion source
id id term term type term
0x00610074005F0074 1 0 1 Exact Match at_t 0 AT_T