sys.dm_fts_parser 是一个很棒的 DMF,可以让您了解全文如何解析句子以及将哪些单词存储在内部索引中。对于您的第一个示例,我看到以下输出 -
select * from sys.dm_fts_parser(N'"Pair: 1/2, half"', 1033, 0, 0)
keyword group_id phrase_id occurrence special_term display_term expansion_type source_term
0x0070006100690072 1 0 1 Exact Match pair 0 Pair: 1/2, half
0x0031 1 0 2 Noise Word 1 0 Pair: 1/2, half
0x006E006E0031 1 0 2 Noise Word nn1 0 Pair: 1/2, half
0x0032 1 0 3 Noise Word 2 0 Pair: 1/2, half
0x006E006E0032 1 0 3 Noise Word nn2 0 Pair: 1/2, half
0x00680061006C0066 1 0 4 Exact Match half 0 Pair: 1/2, half
FT 分解“1/2”并将其索引为 1、nn1、2 和 nn2('nn' 是数值的内部表示)。在这种情况下,将使用默认停止列表,这还会导致这些值被标记为噪声词,因此它们不会添加到索引中。通过从停止列表中删除条目或创建新的空白停止列表并将其与索引相关联,可以轻松规避这一点。
到目前为止,根本没有任何方法可以让 FT 忽略在这种情况下它被视为单词分隔符的“/”符号。
编辑- 显然,有一种解决方法,它涉及创建自定义字典,如此处详述。因此,对于英语,我在 Binn 目录中创建了一个“Custom0009.lex”文件,并为“/”添加了一个条目。这样做会显示 sys.dm_fts_parser 的以下输出(不要忘记重新启动 fdhost) -
select * from sys.dm_fts_parser(N'"Pair: 1/2, half"', 1033, NULL, 0)
keyword group_id phrase_id occurrence special_term display_term expansion_type source_term
0x0070006100690072 1 0 1 Exact Match pair 0 Pair: 1/2, half
0x0031 1 0 2 Exact Match 1 0 Pair: 1/2, half
0x006E006E0031 1 0 2 Exact Match nn1 0 Pair: 1/2, half
0x002F 1 0 3 Exact Match / 0 Pair: 1/2, half
0x0032 1 0 4 Exact Match 2 0 Pair: 1/2, half
0x006E006E0032 1 0 4 Exact Match nn2 0 Pair: 1/2, half
0x00680061006C0066 1 0 5 Exact Match half 0 Pair: 1/2, half
希望这可以帮助。