Kouhei Sutou
kou****@clear*****
2013年 8月 6日 (火) 17:45:26 JST
須藤です。 反応が鈍くてすみません。。。 In <92032****@web10*****> "[groonga-dev,01568] Re: 特殊記号混じりの前方一致検索について" on Thu, 1 Aug 2013 19:10:30 +0900 (JST), <mail_babir****@yahoo*****> wrote: >> ただ、MyISAMで全文検索をしてきた人がどのくらいいる >> のかわからないので、なんとも言えないなぁという気持ちがまだあ >> ります。だれか、そのあたりの事情を教えてくれるとうれしいので >> すが。。。 > > 他に使っている人の意見があるといいのですが。 > > どうしても一対一になってしまうと、 > 「自分の好みを押し付けてしまう1ユーザ VS 需要が不明なものは実装したくない運営」の構図になってしまうと思うので。 そうなんですよねぇ。 > 現状だと、「不正確な検索を放置する」か「不正確な検索になる可能性があればエラーを出して処理を止める」かのどちらかという感じなわけですね。 「不正確な検索を放置する」というのは、「0件ヒットとして扱う」 ということですよね?であれば、その通りです。 mroonga_action_on_fulltext_query_errorにIGNOREか IGNORE_AND_LOGを指定した場合がその挙動です。 http://mroonga.org/ja/docs/reference/server_variables.html#mroonga-action-on-fulltext-query-error >> > 自動エスケープというよりは、特殊文字の解析方法をmyisamに合わせることができれば、より自然でいいかと思います。 >> > >> > myisamの実装を見て、似た実装ができそうなら引き続き検討頂けると有り難いです。 >> >> とすると、エラーの扱いまで含めたMyISAM完全互換のクエリー構文 >> パーサーを作ることになりますねぇ。構文エラーのときにエラー扱 >> いにできないと、パーサーを作るためのツールと相性が悪いので作 >> りづらいんですよね。。。うーん。。。 >> > > 他の部分との連携が難しいんですね。 > 下手するとバグの原因になるかもしれない、とも感じました。 はい、そうなんです。 ツールが想定しないことをごにょごにょやらないといけなくなると 危険な感じがしますね。。。 >> > mroonga_escape()については、あれば確実に便利な関数だと思うので、myisamの挙動の件とは別に実装して頂けると嬉しいです。 >> > (ユーザに特殊文字を使わせたくない場合に、予めその関数でラッピングしておくという使い方もできるので) >> >> はい、ちょっと検討してみます。 > > > ありがとうございます。 > 今のところ、これが一番問題が少ない気がしますね。 機能自体は作ったので、次のリリースまでにはUDFとして使えると ころまで持っていきますね。 >> > しつこく蒸し返して恐縮ですが、特殊文字の解析挙動が合えば、mroongaの導入にあたっての障壁がより低くなることは間違いないと思う(どうやってエスケープしようという点で悩まなくて済むし、後になってエスケープが必要なことを知って慌てることもない)ので、実現可能であれば、ぜひお願いしたいと思います。 >> >> は、はい。。。 >> うーん、私は、ユーザーとしては「特殊文字が勝手に無視されてエ >> ラーにならずに動いているけど期待した挙動じゃないこともある >> (今のMyISAMの挙動)」よりは、「エラーになってすぐに問題がわ >> かる(InnoDBのログをみる場合や今のmroongaの挙動)」というタ >> イプなので、なかなか踏ん切りがつかないんですよねぇ。。。 > > やっぱり好みの問題に行き着いてしまいそうですね。 > > 私の場合、動いたらそれでいい派なので、myisamの動きをみても、さほど不自然に感じないんですよね。 > > 不自然というよりは、元々myisamを使っていたので、挙動としてはそれで当然のような認識になっていたりします。 なるほど。 > このあたりは使い手によるところなんでしょうか。 > > そうなると、他の使い手にとっては正直「どっちでもいい」ような問題を議論してしまっているのかも知れないので、なおさら恐縮ですが・・・。 そうかもしれないですねぇ。 使い方を聞いていたら、「特殊文字をエスケープする機能」という よりも、「特殊文字を取り除く機能 (mroonga_strip_special_characters?)」があると使い方にマッチ するんじゃないかなぁという気がしました。 SELECT ... AGAINST ("(仮)*" IN BOOLEAN MODE); でエラーが返ってきたら SELECT ... AGAINST (mroonga_strip_special_characters("(仮)*") IN BOOLEAN MODE); とするイメージです。↑は SELECT ... AGAINST ("仮" IN BOOLEAN MODE); と等価になる想定です。 これがMyISAMと同じ挙動な気がするんですよね。↑はクライアント 側でリトライしていて、MyISAMはサーバー側でやっているという違 いはありますが。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html