本文介绍在将 SQL Server 全文搜索引擎用于日语时适用的注意事项。
适用范围:SQL Server
原始 KB 数: 2252955
简介
在日语中,短语可能包含两个或多个单词,这些单词之间没有空格。 在 Microsoft SQL Server 中,使用 SQL Server 全文搜索引擎对日语短语执行前缀搜索时,全文搜索引擎不会将短语视为前缀词。 相反,全文搜索引擎会将短语视为字词。 这是因为一个单词定义为没有空格或标点符号的字符串。 此外,搜索引擎仅适用于前缀匹配模式。 搜索引擎在后缀匹配模式下不起作用。
详细信息
例如,在 SQL Server 中运行以下语句,创建表并插入一些日语短语:
CREATE TABLE test(c1 int PRIMARY KEY,c2 nvarchar(255))
INSERT test VALUES(1,N'添付テスト')
INSERT test VALUES(2,N'Fw: テスト')
INSERT test VALUES(3,N'KK-Information:テスト')
INSERT test VALUES(4,N'[Q] ポリシーテスト')
INSERT test VALUES(5,N'KK-Information:タイトルフィルタテスト2')
INSERT test VALUES(6,N'テスト')
INSERT test VALUES(7,N'フィルタテスト3')
INSERT test VALUES(8,N'テストフィルタ1')
INSERT test VALUES(9,N'RE: テストメール')
INSERT test VALUES(10,N'テストメール')
INSERT test VALUES(11,N'White Listテスト')
INSERT test VALUES(12,N'フィルタリングテスト')
CREATE FULLTEXT CATALOG test AS DEFAULT;
GO
CREATE FULLTEXT INDEX ON test(c2) KEY INDEX PK__<IndexName>;
GO
然后,运行以下三个查询:
查询 1
SELECT * FROM test WHERE CONTAINS(c2, N'テスト')
查询 1 的结果如下所示:
c1c2
2Fw: テスト
3KK-Information:テスト
6テスト查询 2
SELECT * FROM test WHERE CONTAINS(c2, 'テスト*')
查询 2 的结果如下所示:
c1c2
2 Fw: テスト
3 KK-Information:テスト
6 テスト
8 テストフィルタ1
9 RE: テストメール
10 テストメール查询 3
SELECT * FROM test WHERE CONTAINS(c2, '*テスト*')
查询 3 的结果如下所示:
c1c2
2 Fw: テスト
3 KK-Information:テスト
6 テスト
8 テストフィルタ1
9 RE: テストメール
10 テストメール从查询结果中,可以发现查询 2 的结果与查询 3 的结果相同,因为全文查询在后缀匹配模式下不起作用。 此外, テスト 令牌与匹配项不同 ポリシーテスト 或不同 テスト 。
若要标记短语,必须使用语言系列的断字符。 工作分隔符使用空格和其他标志来识别短语。 因此,某些短语不能由断字符识别,并且不能使用日语中的全文引擎进行搜索。 有关断字符的详细信息,请参阅参考部分中的断字符和词干分析器主题。
在日语中使用全文搜索引擎的最佳做法是测试短语,以确定短语是否受限制影响。 如果短语由没有空格的单词组成,则不能使用全文功能搜索短语。 相反,可以将 LIKE 关键字与通配符一起使用。 但是,操作的性能
like
低于全文搜索的性能。 必须考虑应用程序的性能效果。下面是用于搜索短语的
like
关键字的一些示例查询。查询 4
SELECT * FROM test WHERE c2 like 'テスト%'
结果如下所示:
c1c2
6 テスト
8 テストフィルタ1
10 テストメール查询 5
SELECT * FROM test WHERE c2 like '%テスト%'
结果如下所示:
c1c2
1 添付テスト
2 Fw: テスト
3 KK-Information:テスト
4 [Q] ポリシーテスト
5 KK-Information:タイトルフィルタテスト2
6 テスト
7 テストフィルタテスト3
8 テストテストフィルタ1
9 RE: テストテストメール
10 テストテストメール
11 テスト
12 フィルタリングテスト
注意
如果在 SQL Server 中使用全文搜索引擎,可以使用以下查询查找有关全文索引内容的详细信息:
SELECT * FROM sys.dm_fts_index_keywords(db_id('test'), object_id('test'))
GO
结果如下所示:
keyword display_term column_id document_count
0x00660077 fw 2 1
0x0069006E0066006F0072006D006100740069006F006E信息 2 2
0x006B006B kk 2
0x006C00690073007430C630B930C8列表テスト 2 1
0x00770068006900740065白色 2 1
0x30BF30A430C830EB30D530A330EB30BF30C630B930C80032タイトルフィルタテスト2 2 1
0x30C630B930C8テスト 2 3
0x30C630B930C830D530A330EB30BF0031テストフィルタ1 2 1
0x30C630B930C830E130FC30EBテストメール 2 2
0x30D530A330EB30BF30C630B930C80033フィルタテスト3 2 1
0x30D530A330EB30BF30EA30F330B030C630B930C8フィルタリングテスト 2 1
0x30DD30EA30B730FC30C630B930C8ポリシーテスト 2 1
0x6DFB4ED830C630B930C8多付テスト 2 1
文件 2 12 的末尾0xFF
(14 行(秒) 受影响)
在示例结果中,只有三行包含单词 テスト。全文搜索引擎将单词“テスト”视为与单词“テストメール”不同的标记。 有关 SQL Server 全文搜索引擎的详细信息,请访问以下Microsoft网站: