SQL Serverにおける「フルテキスト検索の注意事項」について紹介します。
フルテキスト検索とは、データベース内のテキストデータを効率的に検索するための機能です。具体的には、データベースに格納されているテキストデータ全体を対象にして、特定のキーワードやフレーズを検索することができます。
フルテキスト検索用のインデックス(フルテキストインデックス)を利用することで、データベース内のテキストベースのデータに対して通常の検索と比較して高速な検索を行うことが可能です。
速度としては優秀ですが、いくつか注意点があります。
その注意点の中から今回は記号に着目して記述します。
SQL Serverでフルテキスト検索を行うにはCONTAINSとFREETEXTが用意されていますが、今回はCONTAINSについて記載します。
注意点1:フルテキスト検索では記号が無視されたり無視されなかったりする
フルテキスト検索では記号が含まれることを想定していないため、記号が無視されたり無視されなかったりします。
例えば「#」は無視されるのに「!」は無視されません。
記号が無視されたり無視されなかったりすると、想定通りの挙動をしないこともあるので、基本的にはフルテキストインデックスに記号を含まないようにするほうが無難だと考えます。
例)
対象テーブル[user_table]
クエリ
SELECT user_last_name, user_first_name, user_name_search
FROM user_table
WHERE CONTAINS((user_name_search), '"*青 空*"')
実行結果
注意点2:ダブルクォーテーション 「"」を検索文字列に入れるとSQLExceptionになる
記号が無視されるだけならまだしも、Exceptionになるのは回避したいものです。
「"」がExceptionになる理由は構文エラーです。
フルテキスト検索に使用しているCONTAINSの構文規則では「"」は意味のある記号になるため、構文エラーになります。
他にも、構文エラーになる記号としてシングルクォーテーション「'」があります。
これらはエスケープ文字が用意されているため、この問題に対してはエスケープ文字を使用すれば問題ありません。
例)
対象テーブル[user_table]
クエリ
SELECT user_last_name, user_first_name, user_name_search
FROM user_table
WHERE CONTAINS((user_name_search), '"*青 " 空*"')
実行結果
以上になります。本記事が一助になれば幸いです。