都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

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 』ファイルとして保存します。設定内容は下記の通りです。(今回は、『肝不全』と」いうキーワードのみ設定しています。)

f:id:koogucc11:20130825175333j:plain

 『 Custom0011.lex 』ファイルを、SQL Server の指定されたフォルダに配置します。

f:id:koogucc11:20130825175521j:plain

 フルテキストのデーモンを再起動でユーザー辞書が読み込まれます。

f:id:koogucc11:20130825175648j:plain

ユーザー辞書定義前後の動作を比べてみましょう。

※ユーザー辞書定義前の動作は下図の通りです。(検証した記事はここです。)

f:id:koogucc11:20130825150035j:plain

※ユーザー辞書定義後の動作は下図の通りです。

f:id:koogucc11:20130825174308j:plain

 設定前には、『肝』と『不全』と別々に認識されていたキーワードが、設定後には『 spacial_term = Exact Match 』、『肝不全』 となり、SQL Server から単語として認識されました。期待通りの結果です。バージョンアップを繰り返す度に、SQL Server 進化してますね。