morit****@razil*****
morit****@razil*****
2010年 10月 14日 (木) 20:29:03 JST
森です。 >>> Itagaki Takahiro wrote, > 2010/10/14 <morit****@razil*****>: > > queryパラメータの代わりにfilterパラメータを使用して、 > > 以下のように記述すると、期待されている通りに動作すると思います。 > > query と filter の差が良く分かっていなかったです。 > ただ、動作をお聞きした後でも、いくつか疑問が残ってます。 > > ・query が文字列用で、filter が数値用? queryパラメータは主に全文検索クエリを表現するために用意したパラメータです。 match_columnsパラメータで指定したカラムに対する全文検索クエリを渡すのが基本的な使い方です。 よくgoogleなどで、 site:forcia.com のような記法で"forcia.com"ドメイン内での絞り込み条件を指定できるのと 同じようなことが全文検索クエリ文字列で表現できると便利かと思って、 カラム名:値 のような記法を導入しましたが、どちらかというとオマケ的な扱いです。 > ・query と filter は等価なのか、効率に差があるのか? > (名前的に、filter ではインデックスが使えないのかと思っていました) queryパラメータとfilterパラメータは表現できる範囲が少し異なりますが、 パースされたあとは、内部で完全に等価に扱われています。 インデックスの適用も同様に処理されます。 > ・今回の場合、列を文字列にキャストする動作でも、一致 (=) 条件は満たされるような? 確かにその通りですね!!これはgroongaで式をパースする時に、 カラム値と定数とを比較する場合には、あらかじめカラム値の型に定数の値をキャストする 機能を入れていたのですが、それが一致条件の時にしか働いていなかったので このような挙動になっていました。もうちょっとがんばります。 > もうちょっと勉強します。 > > > select --table Test --filter 'int64 <= 344494643000000' > > > > ちなみに、 > > > > select --table Test --query int64:<=344494643000000 > > > > というクエリは、 > > > > select --table Test --filter 'int64 <= "344494643000000"' > > > > と等価に扱われています。 > > > -- > Itagaki Takahiro -- morita