Kouhei Sutou
kou****@clear*****
2015年 10月 15日 (木) 21:39:26 JST
須藤です。 In <CAG72S9+hcyeURVVA-qTxDwtxtCFNwEPewkre5M-=3rpna****@mail*****> "[groonga-dev,03569] Re: 検索方法について" on Thu, 15 Oct 2015 16:51:10 +0900, 立川弘明 <stand****@gmail*****> wrote: >> LIKEでもインデックスが効くと便利かと思ったので↓も動くように >> しておきました。 >> >> * 前方一致: content LIKE 'postgresql%' >> * 後方一致: content LIKE '%postgresql' >> * 部分一致: content LIKE '%postgresql%' >> * 完全一致: content LIKE 'postgresql' >> >> もしかしたらこっちの方が使いやすいかもしれません。 > > 素晴らしい実装をありがとうございます。 > 既存コードの修正箇所を抑えられそうなのでこちらの > 書き方でいきたいと思います。 > > 試しに約50万件のデータを投入し、検索結果、検索速度を > 確認させていただきましたがどちらも期待した通りの結果となりました。 それはよかったです。 注意点なのですが、シーケンシャルスキャンになったときは大文字 小文字を区別を検索する「普通のLIKE」と同じ動作になることに注 意してください。 (インデックスを使ったときは大文字小文字を区別しません。) LIKEではなくILIKEで使えるようにすればシーケンシャルスキャン でも大文字小文字を区別しなくなるのですが、それでも挙動は完全 に同じにならないのでよく使われているLIKEで動くようにしていま す。 どういうときにシーケンシャルスキャンになるかというと、たとえ ば、レコード数が少ないときです。 あとは、LIMITがかかっているときは使うことがあるかもしれませ ん。ヒット数が多くてLIMITが小さいときはインデックスを使わな い方が速いからです。ただ、PGroongaはあんまりマジメにコスト情 報をPostgreSQLに返していないので、そこらへんがうまく効くかは わかりません。 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/