mail_babir****@yahoo*****
mail_babir****@yahoo*****
2013年 8月 7日 (水) 02:26:41 JST
田辺です。
> 反応が鈍くてすみません。。。
いえいえ。
こちらも確認が遅れてしまうことがありますので。
> 使い方を聞いていたら、「特殊文字をエスケープする機能」という
> よりも、「特殊文字を取り除く機能
> (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はサーバー側でやっているという違
> いはありますが。
そうですね。
サーバー側かクライアント側か、どっちでリトライするかという違いしかないとは思うんですが、myisam慣れしていると、このあたりの挙動をサーバー側に任せるオプションがあると嬉しいと思います。
なんというか、これも好みの問題だと思うのですが、特殊文字を含む文字列の検索を厳密にやりたい場面というのは、かなり限られるのではないかと思うのです。
あと、またこじつけ的ですが、もともとmroongaはmroonga_match_escalation_thresholdがデフォルトで0なので、ヒット件数が0件なら検索条件を緩くして再検索していくような作りだと思います。
これに対して、特殊文字のパースエラー1回で検索を停止してしまうのは、このあたりの作りに反しているような印象も受けます。
(そうは言いつつも、タグ検索の用途でエスカレーションすると困るので、手元の環境では基本的に-1にしていたいりますが・・・)
あと、エスケープ関数やmroonga_strip_special_characters関数を使う作りになるならば、第二引数に有効にする特殊文字(あるいは無効にする特殊文字)を指定できるような使い方ができると、使い手に判断を任せることができるので、良さそうです。
頻度は使い手によるとは思うのですが、「()<>~」が使われるのはかなり稀で、それに比べて「+-*」はin boolean modeを使う場合は、かなり頻繁に使われるかと思います。
「+-*」のみが有効ならば、これらの特殊文字が並ばない限りはエラーが出ないようなので、「()<>~」を無効化できれば、だいたいの用途では希望する動作になるのではないかと考えています。
田辺公平