どうもこんにちは。
SQL Serverにおけるフルテキストインデックスの備忘録です。
※なお、SQL Server 2012 R2 で動作検証済みです。
目次
前提
SQL Serverのフルテキスト検索が有効になっていること。
(最近のバージョンはデフォルトで有効らしいですが。)
カタログ作成
1 2 3 4 |
USE [データベース名]; GO CREATE FULLTEXT CATALOG (カタログ名) AS DEFAULT; GO |
例)
1 2 3 4 |
USE my_database; GO CREATE FULLTEXT CATALOG fulltext_catalog AS DEFAULT; GO |
詳細はコチラを参照。
フルテキストインデックス作成
1 2 3 4 5 |
CREATE FULLTEXT INDEX ON (テーブル名) (列名, 列名, ...) KEY INDEX (ユニークインデックス名) ON (カタログ名); GO |
カタログ名はCREATE CATALOGで作成したカタログ名を指定する。
あと、フルテキストインデックスを使用するにあたり、ユニークインデックスが作られていないとダメ。
プライマリキーを指定するのはOK。
プライマリキー = ユニークインデックス + Not NULL制約 ですし。
例)
1 2 3 4 5 |
CREATE FULLTEXT INDEX ON my_table (column_keyword01) KEY INDEX PK_my_table ON fulltext_catalog; GO |
詳細はコチラ。
準備はここまで。
データ取得
ゲロ吐きそうなパフォーマンスが悪かった悪名名高きあいまい検索のSQLを変更
旧)
1 |
SELECT * FROM my_table WHERE column_keyword01 LIKE '%[Keyword]%'; |
新)
1 |
SELECT * FROM my_table WHERE CONTAINS(column_keyword01, '[Keyword]'); |
ただし、LIKEで検索する結果とCONTAINSで検索する結果が異なる可能性がある。
詳しくはコチラ。
TODO
- CONTAINSではなく、FREETEXTを使って検索した時の結果について調査
- パフォーマンスチューニング
- 他RDBMSでも同じことができるのか、代替案はあるのか
#もうちょっと早めに調査しとけばよかった。。。
以上、ほぼ個人用メモでした。