对日语使用 SQL Server 全文搜索引擎时的注意事项

本文介绍在将 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网站: