SQL Server のユーザー辞書定義によるワード ブレーカー動作について調べてみた
『 dm_fts_parser について検証してみた 』の記事で少し触れた、ワード ブレーカーの動作について調査しました。ユーザー辞書を設定することで、単語分割の動作を変更することができるようです。 ここに記載があります。他のバージョンに対する記載がないので、おそらく、SQL Server 2012 からの機能と思われます。設定手順は以下の通りです。
言語固有のユーザー辞書ファイルを作成することで、特定の言語のワード ブレーカーの動作をカスタマイズできます。 たとえば、特定の用語やパターンがワード ブレーカーによって区切られないようにすることができます。詳細については、次の SharePoint の記事を参照してください。
ユーザー辞書を作成する (SharePoint Server 2010)
SQL Server では、ユーザー辞書ファイルを次のフォルダーに配置します。
C:\Program Files\Microsoft SQL Server\<instance name>\MSSQL\Binn
ユーザー辞書ファイルの作成または変更後、次のコマンドで SQL フルテキスト デーモン ランチャーを再起動します。
exec sp_fulltext_service 'restart_all_fdhosts'
早速みてみましょう。カスタム辞書の作成ルールは以下の通りです。
Rules for creating a custom dictionary
A custom dictionary is a Unicode-formatted file. Each entry must be on a separate line, separated by a carriage return (CR) and line feed (LF). When you add entries to a custom dictionary, consider the following rules to avoid unexpected results:
Entries are not case-sensitive.
The pipe character (|) cannot be used.
White space cannot be used.
The number sign character (#) cannot be used at the beginning of an entry but it can be used within or at the end of an entry.
Except for the pipe, number sign, and white-space characters previously mentioned, any alphanumeric characters, punctuation, symbols, and breaking characters are valid.
The maximum length of an entry is 128 (Unicode) characters.
『カスタム辞書はUnicode形式のファイルです。各エントリには、キャリッジリターン(CR)とラインフィード(LF)で区切られた別々のライン上にある必要があります。次の規則を守りましょう。』だそうです。
- 大文字と小文字を区別しません。
- パイプ文字は使用できません。
- 空白は使用できません。
- 番号記号文字(#)エントリの先頭に使用することはできませんが、それ以外には使用可能です。
- パイプ、番号記号、および前述の空白文字は、任意の英数字、句読点、記号の文字を以外は使用できます。
- 単語の長さは128文字です。
早速設定してみましょう。作成したデータを、『 Custom0011.lex 』ファイルとして保存します。設定内容は下記の通りです。(今回は、『肝不全』と」いうキーワードのみ設定しています。)
『 Custom0011.lex 』ファイルを、SQL Server の指定されたフォルダに配置します。
フルテキストのデーモンを再起動でユーザー辞書が読み込まれます。
ユーザー辞書定義前後の動作を比べてみましょう。
※ユーザー辞書定義前の動作は下図の通りです。(検証した記事はここです。)
※ユーザー辞書定義後の動作は下図の通りです。
設定前には、『肝』と『不全』と別々に認識されていたキーワードが、設定後には『 spacial_term = Exact Match 』、『肝不全』 となり、SQL Server から単語として認識されました。期待通りの結果です。バージョンアップを繰り返す度に、SQL Server 進化してますね。