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

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 7月 26日 (金) 22:09:35 JST


須藤です。

In <93238****@web10*****>
  "[groonga-dev,01543] Re: 特殊記号混じりの前方一致検索について" on Thu, 25 Jul 2013 08:44:59 +0900 (JST),
  <mail_babir****@yahoo*****> wrote:

> またご返信が遅れてしまいました・・・。

ぜんぜん大丈夫です!

> 確かにエスケープ文字としてどれを使うかは難しいところと思います。
> ¥でだめなら$で、みたいな考えしか出てこないですね・・・。
> 
> こればかりは問題の少なそうな文字を選んでもらうしかないかと思います。
> エスケープ文字は検索時に消える、くらいの認識で考えると、その文字自体を検索したい場合が少なそうな文字を選ぶのがベストではあるかと思います。
> 
> ドキュメントに明記する限りは、エスケープ文字が一般的な文字でなくても大丈夫とは思います(それなら\2つでエスケープという説明でわかりにくいとは言い切れなくなってしまいますが・・・)
> 
> ただ個人的には、現状の「\\\\」や「\\(」のような記述は、やはり直感的でないと思うので、「$$」や「$(」のような形式でエスケープできるようになれば、と思います。

別の案を思いつきました!
mroonga_escape()みたいな関数を提供して、

  SELECT ... WHERE
    MATCH (...) AGAINST (mroonga_escape("(仮)") IN BOOLEAN MODE);

というようにするのはどうでしょうか?これで「(仮)」そのものを
検索するイメージです。(「(...)」をグループ化する書き方とし
て認識しない。)

前に出ていた「クエリー全体を全部自動でエスケープ」案と違って、
関数なのでエスケープする範囲をアプリケーションで制御できます。
例えば、

  AGAINST (mroonga_escape("(仮)") + "*" IN BOOLEAN MODE)

とすれば「*」という特殊な文字を使って前方一致検索を使いつつ、
特殊文字を使いたくない範囲だけ特殊文字を無効にできます。


いかがでしょうか?
-- 
須藤 功平 <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