Kouhei Sutou
null+****@clear*****
Wed Feb 11 14:27:34 JST 2015
Kouhei Sutou 2015-02-11 14:27:34 +0900 (Wed, 11 Feb 2015) New Revision: b1c19f9a939a50294b4f7aaf5bccfae9f680f075 https://github.com/pgroonga/pgroonga/commit/b1c19f9a939a50294b4f7aaf5bccfae9f680f075 Message: Describe about LIKE operator Modified files: README.md Modified: README.md (+86 -0) =================================================================== --- README.md 2015-02-11 14:01:53 +0900 (43ea1a9) +++ README.md 2015-02-11 14:27:34 +0900 (f45c919) @@ -168,6 +168,7 @@ CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content); INSERT INTO memos VALUES (1, 'PostgreSQLはリレーショナル・データベース管理システムです。'); INSERT INTO memos VALUES (2, 'Groongaは日本語対応の高速な全文検索エンジンです。'); INSERT INTO memos VALUES (3, 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。'); +INSERT INTO memos VALUES (4, 'groongaコマンドがあります。'); ``` 検索します。ここではシーケンシャルスキャンではなくインデックスを使った @@ -178,6 +179,8 @@ INSERT INTO memos VALUES (3, 'PGroongaはインデックスとしてGroongaを SET enable_seqscan = off; ``` +##### `%%`演算子 + 全文検索をするときは`%%`演算子を使います。 ```sql @@ -188,6 +191,8 @@ SELECT * FROM memos WHERE content %% '全文検索'; -- (1 行) ``` +##### `@@`演算子 + `キーワード1 OR キーワード2`のようにクエリー構文を使って全文検索をする ときは`@@`演算子を使います。 @@ -210,6 +215,87 @@ SELECT * FROM memos WHERE content @@ 'PGroonga OR PostgreSQL'; 注意してください。 +##### `LIKE`演算子 + +既存のSQLを変更しなくても使えるように`column LIKE '%キーワード%'`と書 +くと`column @@ 'キーワード'`と同等の処理になるようになっています。 + +なお、`'キーワード%'`や`'%キーワード'`のように最初と最後に`%`がついて +いない場合は必ず検索結果が空になります。このようなパターンはインデック +スを使って検索できないからです。気をつけてください。 + +本来の`LIKE`演算子は元の文字列そのものに対して検索しますが、`@@`演算子 +は正規化後の文字列に対して全文検索検索を実行します。そのため、インデッ +クスを使わない場合の`LIKE`演算子の結果(本来の`LIKE`演算子の結果)とイ +ンデックスを使った場合の`LIKE`演算子の結果は異なります。 + +たとえば、本来の`LIKE`演算子ではアルファベットの大文字小文字を区別した +りいわゆる全角・半角を区別しますが、インデックスを使った場合は区別なく +検索します。 + +本来の`LIKE`演算子の結果: + +```sql +SET enable_seqscan = on; +SET enable_indexscan = off; +SET enable_bitmapscan = off; +SELECT * FROM memos WHERE content LIKE '%groonga%'; +-- id | content +-- ----+----------------------------- +-- 4 | groongaコマンドがあります。 +-- (1 行) +``` + +インデックスを使った`LIKE`演算子の結果: + +```sql +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = on; +SELECT * FROM memos WHERE content LIKE '%groonga%'; +-- id | content +-- ----+--------------------------------------------------------------------------- +-- 2 | Groongaは日本語対応の高速な全文検索エンジンです。 +-- 3 | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 +-- 4 | groongaコマンドがあります。 +-- (3 行) +``` + +インデックスを使った場合でも本来の`LIKE`演算子と同様の結果にしたい場合 +は次のようにトークナイザー(後述)とノーマライザー(後述)を設定してイ +ンデックスを作成してください。 + + * トークナイザー: `TokenBigramSplitSymbolAlphaDigit` + * ノーマライザー: なし + +具体的には次のようにインデックスを作成します。 + +```sql +CREATE INDEX pgroonga_content_index + ON memos + USING pgroonga (content) + WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', + normalizer=''); +``` + +このようなインデックスを作っているときはインデックスを使った`LIKE`演算 +子でも本来の`LIKE`演算子と同様の挙動になります。 + +```sql +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = on; +SELECT * FROM memos WHERE content LIKE '%groonga%'; +-- id | content +-- ----+----------------------------- +-- 4 | groongaコマンドがあります。 +-- (1 行) +``` + +多くの場合、デフォルトの設定の全文検索結果の方が本来の`LIKE`演算子の方 +の検索結果よりもユーザーが求めている結果に近くなります。本当に本来の +`LIKE`演算子の挙動の方が適切か検討した上で使ってください。 + #### カスタマイズ `CREATE INDEX`の`WITH`でトークナイザーとノーマライザーをカスタマイズす -------------- next part -------------- HTML����������������������������...Download