YTsudaのブログ

1985生まれ、男。東京で働くWeb制作者

groongaのfilter検索条件でスペースが使えない?

groonga で select をする際の条件指定(SQLでいうWHERE句)には、
query と filter という2種類の方法がある。
今回は類似検索を使いたいので、filter を使うことにした。

そこで、ドキュメントのこのあたりを参考にしつつ、
以下のようなクエリを投げてみるがどうもうまくいかない。

$ groonga hoge.db select hoge_table --filter '_id == 1'

以下のようなエラーメッセージが出る

"invalid table name: <==>"

同等の条件をquery方式で指定してみると、こちらは正しくデータを取得できた

$ groonga hoge.db select hoge_table --query '_id:1'

よくわからないので、いろんなクエリを試していたところ、
filter条件文のスペースを消したら動くようになった

$ groonga hoge.db select hoge_table --filter '_id==1'

解決

スペースをエスケープしたら解決した

$ groonga hoge.db select hoge_table --filter '_id\ ==\ 1'

ちなみに、groonga の対話モードからクエリを投げたら、
エスケープしなくてもselectに成功した。

$ groonga hoge.db 
> select hoge_table --filter '_id == 1'

解決2

当記事へのコメントで教えていただいた通り、以下のように
二重のクォーテーションで囲むとエスケープしなくても成功するようになった。

$ groonga hoge.db select hoge_table --filter '"_id == 1"'

これで解決する理由は以下のとおり、引用させていただきます。

ひとつずつスペースをエスケープするよりは'"_id == 1"'という感じで「'"..."'」というスタイルが書きやすいかと思います。これだと、シェルが解釈した後に外側のシングルクォートがとれて「"..."」だけが残って、groongaが解釈した後は内側のダブルクォートがとれて「...」だけが残ります!


一応、groongaのバージョン

"groonga 3.0.3 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,msgpack,zlib,lzo,epoll]"

ubuntuのバージョン

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.10
Release:        12.10
Codename:       quantal