Kouhei Sutou
kou****@clear*****
2013年 7月 12日 (金) 15:02:04 JST
須藤です。 In <54781****@web10*****> "[groonga-dev,01532] Re: 特殊記号混じりの前方一致検索について" on Wed, 10 Jul 2013 15:34:54 +0900 (JST), <mail_babir****@yahoo*****> wrote: > 設定ファイルで影響のありそうな部分というと、このあたりな気がしますが、 > 直接影響しているようには思えないですね・・・ > > # character-set > character-set-server=utf8 > skip-character-set-client-handshake > > # enable to serach 1-3len word > ft_min_word_len=1 情報ありがとうございます! > # enable to serach 1-3len word > ft_min_word_len=1 これが影響していました。これを有効にすると田辺さんと同じ結果 になりました。 >> 1. 「\」で特殊文字をエスケープできるようにする >> 2. 特殊文字をmroongaのドキュメントに明記する >> 3. エラーが起きてもクライアントに報告せず、ログを出力する >> だけにするモードを用意する >> (結果は0件になる。) >> (変数で挙動を変えられるようにする。) 1.と3.を実装しました。 3.用に新しく以下のセッション変数を用意しました。 mroonga_action_on_fulltext_query_error: ERROR: エラー扱いにする ERROR_AND_LOG: エラー扱いにして、ログも出力する。(現在の挙動。デフォルト。) IGNORE: 無視する。 IGNORE_AND_LOG: 無視するがログには出力する。(InnoDBのような挙動。) > 少なくとも、「\」でエスケープできるようにすることで、「"」を含む文字の場合のエスケープだけ特別視する、という必要はなくなるかと思うので、アプリケーション側での対応がわかりやすくなりそうです。 > それに、フレーズ検索とは分けて扱えるようになるところもメリットだと思います。 あ、たしかにそうですね! > あと、今回の内容に関してのことだったか曖昧なのですが、「\」の検索の際に「\\\\」というエスケープが必要という情報をどこかで見た記憶があります。 > > 「\」自体の検索は「\\」というエスケープでできるようにお願いしたいと思います。 > これなら「\」も特殊文字と考えて、他の特殊文字と同じようにエスケープが必要という認識を持つだけで済むので。 「\」の次の文字は特殊な文字かどうかに関わらずそのものとして 解釈するようにしました。 \\ -> \ \A -> A \( -> ( ... これで、期待した動作になっていますか? 「\\」は「\」と解釈するようになっているので、私はこれであっ ているかなぁと思っています。 ただ、SQLで書くときは AGAINST("\\\\") となることに注意してください。 これは、 "\\\\" を文字列リテラルと解釈するときに*MySQLが*「\\」を「\」に変換 するためです。 "\\\\" ↓ MySQLが文字列リテラルとして解釈 \\ (groongaのクエリーパーサーに渡る文字列) ↓ groongaがクエリーとして解釈(今回の変更) \ > 個人的には、ログ出力のみをさせるという形式の方が、他のストレージエンジンと挙動が合っているように思います。 > デフォルトの設定としても問題ないと思うのですが、この点は後方互換性の考慮が必要かもしれないですね。 互換性を考慮して、今の挙動をデフォルトにしました。。。 -- 須藤 功平 <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