[groonga-dev,01573] Re: 特殊記号混じりの前方一致検索について

Back to archive index

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




groonga-dev メーリングリストの案内
Back to archive index