ここでは部分一致検索を説明していきますが、まずは以下のような検索を実行してみてください。
# SELECT txt FROM tbl WHERE txt @@ 'こんに';
txt
------------------------
こんにちは
こんにちは、さようなら
(2 rows)
「こんに」が含まれる行が取得できています。これは一見当然にみえますが、今回の例で利用しているインデックスは(インデックスアクセスメソッドとしてfulltextを指定しているので)形態素解析を用いている単語インデックスです。次のようにコマンドラインでmecabコマンドを実行してみるとわかるのですが、「こんにちは」はこれで1つの単語で、それ以上細かく分解されません。
$ echo 'こんにちは' | mecab
こんにちは 感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
EOS
したがって、単純に考えれば「こんに」を検索しても、「こんにちは」を含む行は得られないように思われます。ここで「こんに」を含む検索結果が得られてるのは、完全一致検索だけではなく、部分一致検索が行われているからです。
つまり、全文検索インデックスに登録されている単語から、「こんに」が部分一致する単語(ここでは「こんにちは」)を探し、それを含む行を取得しています。
この部分一致検索は常に行われるわけではありません。多くの場合、ヒット件数が多くなりすぎてしまうからです。そのため、デフォルトの設定では、検索結果が1件もなかったらさらに部分一致検索を実行して該当するものを探すようになっています。次のような検索を実行すると、検索結果には「こんにちは」という行が含まれなくなります。
# SELECT txt FROM tbl WHERE txt @@ 'こんに OR さようなら';
txt
------------------------
さようなら
こんにちは、さようなら
(2 rows)
この挙動は「*E」という特別な記号(プラグマ)を検索条件のはじめにつけることで、変更することができます。例えば、次のように検索条件を指定すると、ヒット件数が2件以下の場合にさらに部分一致検索を行ってヒットするものがないか探す、という動作になります。
# SELECT txt FROM tbl WHERE txt @@ '*E2 こんに OR さようなら';
txt
------------------------
さようなら
こんにちは、さようなら
こんにちは
(3 rows)
|