Kouhei Sutou
kou****@clear*****
2015年 10月 13日 (火) 21:36:01 JST
須藤です。 In <CAG72****@mail*****> "[groonga-dev,03563] 検索方法について" on Tue, 13 Oct 2015 19:51:05 +0900, 立川弘明 <stand****@gmail*****> wrote: > 前方一致の検索方法について質問させて下さい。 > > https://github.com/pgroonga/pgroonga > の「基本的な使い方」において前方一致を試したのですが結果が以下のようになります。 > > pgroonga_test=# SELECT * FROM memos WHERE content @@ 'PostgreSQL*'; > id | content > ----+--------------------------------------------------------------------------- > 1 | PostgreSQLはリレーショナル・データベース管理システムです。 > 3 | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 > (2 行) > > id=1の行のみヒットすると思ったのですが、id=3の行もヒットしているので部分一致の動きに見えます。 > これは通常の挙動なのでしょうか。 はい、通常の挙動です。 これはドキュメントが悪いですね。。。 「全文検索用のインデックス」と「前方一致検索」を組み合わせて 使うと、 * 検索対象のテキストに対して前方一致検索 ではなく、 * トークンに対して前方一致検索 になります。 (↑の違いがピンとこない場合は追加で説明するので言ってくださ い。転置インデックスを使って全文検索をする仕組みを知っていれ ばピンときて知らなければピンとこなそうな気がします。ちなみに、 私は、PGroongaユーザーは知らなくてもいいと思っています。) たとえば、「PostgreSQL*」は「PostgreSQL」からはじまるトーク ンという意味になります。ただ、このデータでは「PostgreSQL」か らはじまるトークンが「PostgreSQL」しかないので「PostgreSQL」 と「PostgreSQL*」で違いはありません。 次のように「Postgr」と「Postgr*」では違いがでます。 (「日本語 OR」が最初についているのは、Groongaはデフォルトで はヒット件数が0件のときに自動で条件を緩めて再検索する機能を 無効にするためです。 参考: http://groonga.org/ja/docs/spec/search.html ) pgroonga_test=# SELECT * FROM memos WHERE content @@ '日本語 OR Postgr'; id | content ----+--------------------------------------------------- 2 | Groongaは日本語対応の高速な全文検索エンジンです。 (1 row) pgroonga_test=# SELECT * FROM memos WHERE content @@ '日本語 OR Postgr*'; id | content ----+--------------------------------------------------------------------------- 2 | Groongaは日本語対応の高速な全文検索エンジンです。 1 | PostgreSQLはリレーショナル・データベース管理システムです。 3 | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 (3 rows) > # 現在Postgresを使用している検索システムがあるのですが、部分一致検索の性能改善を主な目的としてリプレイスを検討しています。 > # 検索条件には前方、後方、部分、完全 が指定でき、それぞれを組み合わせる場合もあります(前方:あ かつ 部分:い 等) > # これらをPGroongaで実現できれば・・・と思った次第です。 それであれば正規表現ベースのトークナイザーを使うとよいです。 と思ったんですが、正規表現を使える機能は無効にしていたんでし た。。。 ちなみに、大文字と小文字は無視して検索でもよいですか? であれば、「@~」という演算子を追加して正規表現ベースのトーク ナイザーを使えるようにします。それを使うと次のように条件を書 けるようになります。 * 前方一致: content @~ '\Apostgresql' * 後方一致: content @~ 'postgresql\z' * 部分一致: content @~ 'postgresql' * 完全一致: content @~ '\Apostgresql\z' たぶん、Groongaをしらないとピンとこないと思いますが、参考ま でにGroongaの正規表現サポートのドキュメントのURLを置いておき ます。 http://groonga.org/ja/docs/reference/regular_expression.html -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/