L
次のページ
H
前のページ
U
上のページ

« ローカルプレビュー時の公開プロセス | Main | カテゴリページのファイル名生成に仕様上のバグあり »

2006年08月04日

検索のワイルドカード

メイン画面の検索ボタンまたはメニュー項目 [編集]-[エントリを検索] からできる検索ではワイルドカードが使える。SQL の LIKE 演算子を使っているから便利だ。逆に少し困ることもある。

最近この検索機能を度々使っている。500 以上のエントリの中からもスパンと検索してきてくれてとても軽快だ。それもそのはず、Thingamablog がエントリのデータなどを格納するのに HSQLDB という Java のデータベースを使っているからだ。

先程も検索していてふと思った。「データベースを使って一つのフィールドの部分文字列を検索しているということは LIKE 演算子を使っているんだろうなあ。LIKE 演算子を使っているのならワイルドカードが効くはずだ」と。そこで試してみた。

SQL を使う人ならば LIKE 演算子はお馴染みだと思うが、少し解説すると、データベースに格納されているレコード(フィールドと呼ばれるデータの集まり)を条件を付けて検索するのに、あるフィールドが○○と一致するとか大きいとか小さいとかそういう条件を付ける。その条件の指定の仕方に「○○のような」というのがあり、それを指定するときに使うのが LIKE 演算子なのだ。もちろんコンピュータは曖昧なことはわからないから「○○のような」はワイルドカードという任意の文字に当て嵌まる記号を交えて記述する。例えば「お_さん」は「お姉さん」「お兄さん」「お母さん」「お父さん」にマッチするが「おじいさん」にはマッチしない。“_”は任意の一文字を表すからだ。これを「お%さん」にすると「お姉さん」「お兄さん」「お母さん」「お父さん」はもちろん「おじいさん」にもマッチする。“%”は任意の文字の 0 個以上の並びにマッチするからだ。それぞれエディタなどの検索で使用する正規表現の“.”、“.*”と同じ役割を果たす。

というわけで Thingamablog のエントリの検索機能では“_”と“%”がワイルドカードとして使える。これはこれで便利だ。

しかし不便なこともある。HSQLDB の LIKE 演算子では“_”や“%”自身を表すときはバックスラッシュをその前に付けてエスケープすることになっている。ところがバックスラッシュを付けても円マークを付けてもエスケープされないのだ。“%”を探すために“\%”とやっても “\”が検索されてしまう。Thingamablog のソースを追ってみたが、ダイアログの文字列をそのまま SQL 文に埋め込んでいるように見える。

HSQLDB の org.hsqldb.jdbcPreparedStatement クラスのメソッド setString を使って埋め込んでいるのだが HSQLDB のバグか仕様なのだろうか? Thingamablog 1.0.5 が使用している HSQLDB 1.7.1 のドキュメントには埋め込まれる文字列のバックスラッシュがエスケープされるとは書いていない。作者に投げてみようかなあ。