Kouhei Sutou
kou****@clear*****
2015年 10月 14日 (水) 18:38:12 JST
須藤です。 In <CAG72S9LxA-=LuS_KGjcx001cm_EgN=jAZEOD13=RMnii****@mail*****> "[groonga-dev,03567] Re: 検索方法について" on Wed, 14 Oct 2015 15:59:43 +0900, 立川弘明 <stand****@gmail*****> wrote: >> * 検索対象のテキストに対して前方一致検索 >> >> ではなく、 >> >> * トークンに対して前方一致検索 > > なるほど、そういうことだったのですね。 > ドキュメントも合わせて読ませていただき、大まかですが理解できました。 > (ピンときているかはわかりませんが・・・) それはよかったです。 もし、都内にいて、ピンときているか確認した方がよさそうであれ ば、「Groongaで学ぶ全文検索 2015-10-16」にお越しください。 https://groonga.doorkeeper.jp/events/32517 きっとピンとくると思います。 > 前方一致の意味として、PGroonga(Groonga)の全文検索の場合は > トークン単位で考えるよう切り替える必要があるということですね。 はい、そうです。 全文検索用ではないインデックスのときはテキスト全体で考えてよ い↓のですが、全文検索の場合はトークン単位です。 https://github.com/pgroonga/pgroonga#%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B >> 次のように「Postgr」と「Postgr*」では違いがでます。 > > こちらの例もとても納得できました。ありがとうございます。 > ちなみにトークナイザにTokenBigramSplitSymbolAlphaを指定すれば「Postgr」でも > ヒットするようになると思っているのですが合っていますでしょうか。 はい、あっています。 >> それであれば正規表現ベースのトークナイザーを使うとよいです。 >> と思ったんですが、正規表現を使える機能は無効にしていたんでし >> た。。。 >> >> ちなみに、大文字と小文字は無視して検索でもよいですか? > > はい、大丈夫です。 > 現在でも区別しておりません。 > > >> であれば、「@~」という演算子を追加して正規表現ベースのトーク >> ナイザーを使えるようにします。それを使うと次のように条件を書 >> けるようになります。 >> >> * 前方一致: content @~ '\Apostgresql' >> * 後方一致: content @~ 'postgresql\z' >> * 部分一致: content @~ 'postgresql' >> * 完全一致: content @~ '\Apostgresql\z' > > ありがとうございます。 > ぜひ使ってみたいです。 > が、お手数をおかけしてしまいなんだか恐縮です・・・。 であれば、↓を試してみてもらえますか? ↑が使えるようになっています。 http://packages.groonga.org/tmp/postgresql94-pgroonga-1.0.0-1.el7.centos.x86_64.rpm ↑をインストールした後、ALTER EXTENSION pgroonga UPDATEする とアップグレードできます。 インデックスを作るときは↓のようにオペレータークラスとして pgroonga.text_regexp_opsを指定してください。 CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops); ↓のコミットの中にあるテストがクエリー例になっているので、参 考にしてください。 https://github.com/pgroonga/pgroonga/commit/d0b2d675e0a8c570a83484977bd7cf77fa8fc60a 注意点は次の通りです。 * 検索文字列(「\Apostgresql」でいうと「postgresql」の部分) は小文字にしてください。 * http://groonga.org/ja/docs/reference/regular_expression.html#escape にある特殊文字はエスケープしてください。 LIKEでもインデックスが効くと便利かと思ったので↓も動くように しておきました。 * 前方一致: content LIKE 'postgresql%' * 後方一致: content LIKE '%postgresql' * 部分一致: content LIKE '%postgresql%' * 完全一致: content LIKE 'postgresql' もしかしたらこっちの方が使いやすいかもしれません。 -- 須藤 功平 <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/