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