mail_babir****@yahoo*****
mail_babir****@yahoo*****
2013年 7月 9日 (火) 21:25:08 JST
田辺です。 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 Innodbのほうはバージョンの問題でフルテキストインデックスが使えなかったため、検証できていません。 上記の検索結果が、アプリケーション経由でも確認できていたため、mroongaでエラーとなる点に問題を感じてのことだったのですが、5.6からはヒットしなくなっているんでしょうか・・・ > MyISAMの挙動とはずれていきますが、「(」、「)」、「*」、「+」 > など特殊な文字を特殊な文字と解釈せずにそのものとして検索する > モードを用意するのはどうでしょうか? そういう方法も考えられるんですね。 ただ、個人的には「+-*」あたりの記号は使いそうなので、使う記号も指定できないと難しそうです。 > うーん、デフォルトで「(」、「)」、「*」、「+」などを使った高 > 度な使い方ができることが使い勝手の問題につながっているのでは > ないかと感じました。前方一致検索やグループ化などといった高度 > な使い方をしない人は「(」、「)」、「*」、「+」はそのまま検索 > して欲しく、エスケープが邪魔に感じるのかと思いました。 手元の環境でMyISAMが特殊記号を含んでいる場合にも、さほど問題のない検索結果をエラーなく返していたので、mroongaが目に見える形でエラーを返して処理を止めてしまうという挙動が目立ったのかもしれません。 ただ、もしかするとバージョンによっても挙動が違う可能性があるので、なんともいえない状況ですね。 > あまりうまく伝えられた気がしませんが、シンタックスエラーの挙 > 動をMyISAM時に合わせることにはまだ抵抗を感じています。。。 > 本当に必要なのか、というところがピンときていないからかもしれ > ません。 ここまで意見しておいて今更ではあるんですが、「バックスラッシュでエスケープできるようにする」ほうを優先して頂く方が、他の方にはメリットがあるかもしれません。 現状ではドキュメントにエスケープが必要な文字と、エスケープ方法がしっかりと書かれていないため、後になってエラーが出てから、どの文字がエスケープが必要なのかと探す形になっているところが問題としては大きい気がしてきました。 エスケープが適切にできていないと、それなりの頻度でエラーが生じるため、アプリケーション側でログをとっている場合に、他のエラーがシンタックスエラーに埋もれてしまうことがよくあり、この点が気になることがよくありました。 エスケープができていれば、シンタックスエラーは出ないはずなので、これに必要な手順が確立され周知できていれば、エラー表示は気にならなくなるかと思います。 田辺公平