Kouhei Sutou
kou****@clear*****
2013年 7月 10日 (水) 10:21:29 JST
須藤です。 In <26075****@web10*****> "[groonga-dev,01528] Re: 特殊記号混じりの前方一致検索について" on Tue, 9 Jul 2013 21:25:08 +0900 (JST), <mail_babir****@yahoo*****> wrote: > MyISAMの場合で、須藤さんの環境と異なった検索結果が出ました。 > > mysql> SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('(仮*' IN BOOLEAN MODE); > 2 rows in set (0.00 sec) > > mysql> SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('(仮)*' IN BOOLEAN MODE); > 1 rows in set (0.00 sec) > > Mysqlのバージョンは5.5.32 おぉ、なんと。。。 私はDebian GNU/Linux sidのパッケージの5.5.31で試しました。 念のため、もう一度試してみたのですが、私の環境ではヒットしま せんでした。 > 上記の検索結果が、アプリケーション経由でも確認できていたため、mroongaでエラーとなる点に問題を感じてのことだったのですが、5.6からはヒットしなくなっているんでしょうか・・・ 5.5系でもヒットしないので、何か設定が必要なのかもしれませ ん。。。 >> MyISAMの挙動とはずれていきますが、「(」、「)」、「*」、「+」 >> など特殊な文字を特殊な文字と解釈せずにそのものとして検索する >> モードを用意するのはどうでしょうか? > > そういう方法も考えられるんですね。 > ただ、個人的には「+-*」あたりの記号は使いそうなので、使う記号も指定できないと難しそうです。 なるほど、そうですか。。。 > 現状ではドキュメントにエスケープが必要な文字と、エスケープ方法がしっかりと書かれていないため、後になってエラーが出てから、どの文字がエスケープが必要なのかと探す形になっているところが問題としては大きい気がしてきました。 > > エスケープが適切にできていないと、それなりの頻度でエラーが生じるため、アプリケーション側でログをとっている場合に、他のエラーがシンタックスエラーに埋もれてしまうことがよくあり、この点が気になることがよくありました。 あぁ、たしかにそれはあると思います。 > エスケープができていれば、シンタックスエラーは出ないはずなので、これに必要な手順が確立され周知できていれば、エラー表示は気にならなくなるかと思います。 どうするのがよいか考えることにいろいろ協力してもらってありが とうございます。以下の方向で対応してみるので、また使い勝手な どを教えてもらえるとうれしいです。 1. 「\」で特殊文字をエスケープできるようにする 2. 特殊文字をmroongaのドキュメントに明記する 3. エラーが起きてもクライアントに報告せず、ログを出力する だけにするモードを用意する (結果は0件になる。) (変数で挙動を変えられるようにする。) と書いて、該当するgroongaのドキュメントを確認してみたのですが、 すでに「\」でエスケープできるような記述になっていますね。。。 http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html#escape ソースをみると対応していなさそうなのに。。。確認しておきます。 -- 須藤 功平 <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