Motoi Washida
wm3****@mail*****
2013年 8月 14日 (水) 00:19:45 JST
こんにちは。
前回はお返事とバグ修正をしてもらって、ありがとうございました。m(__)m
さて早速なのですが、若干怪しい挙動を見つけてしまったのでお伝えします。
現象
----------------
フィルタとクエリを組み合わせて検索しようした時に、検索が引っかからないという現象に遭遇しました。
具体的には、
- filter に何らかの Bool 演算を使用する
- その上で、 query に検索対象を明記しない(match_column を使う)
と、一部検索が引っかかりませんでした。
- filter で Bool 演算や型を使用しない
- query で「content:夏休み」のように検索対象を明記する
と期待通りにうまく行っているようでした。
例
----------------
以下のようにデータを構築しました。
% cat structure.txt
table_create A --key_type ShortText
column_create A t --type ShortText
column_create A b --type Bool
load --table A
[
{ _key: "a1", t: "t1", b: true }
]
table_create Terms --flags TABLE_PAT_KEY --key_type ShortText --normalizer NormalizerAuto --default_tokenizer TokenBigram
column_create --table Terms --name a_t_i --flags COLUMN_INDEX|WITH_POSITION --type A --source t
% ../g/bin/groonga -n x < structure.txt
[[0,1376407109.73427,0.000485897064208984],true]
[[0,1376407109.7348,0.000694990158081055],true]
[[0,1376407109.73551,0.000205039978027344],true]
[[0,1376407109.73573,0.000280857086181641],1]
[[0,1376407109.73602,0.00029301643371582],true]
[[0,1376407109.73632,0.00601291656494141],true]
前提条件として、フィルタやクエリの単独の処理はうまく行きます。
> select A --match_columns t --query t1
[[0,1376405600.47844,0.0046379566192627],[[[1],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]],[1,"a1",true,"t1"]]]]
> select A --filter 'b'
[[0,1376405605.18812,0.0002288818359375],[[[1],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]],[1,"a1",true,"t1"]]]]
この状態で、以下の問い合わせを実行します。
> select A --match_columns t --query t1 --filter 'b'
[[0,1376405609.01942,0.000233173370361328],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
> select A --match_columns t --query t1 --filter '! b'
[[0,1376405613.07004,0.000195026397705078],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
このように filter で「b」にしても「 ! b」にしても検索に引っかかりませんでした。
追加の検証
----------------
query のカラムを指定する場合は期待通りに引っかかります。
> select A --query t:t1 --filter 'b'
[[0,1376405622.54404,0.000234842300415039],[[[1],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]],[1,"a1",true,"t1"]]]]
> select A --query t:t1 --filter '! b'
[[0,1376405626.54775,0.00023198127746582],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
フィルタの条件を色々試した結果、Bool 型やブール演算を行うとおかしくなるように見えました。以下のフィルタは全て一つのレコードが返ることを期待しています。
> select A --match_columns t --query t1 --filter 'b == true'
[[0,1376405633.30953,0.00024104118347168],[[[1],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]],[1,"a1",true,"t1"]]]]
> select A --match_columns t --query t1 --filter 'b == true && true'
[[0,1376405637.90958,0.000178098678588867],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
> select A --match_columns t --query t1 --filter 'b == true || true'
[[0,1376405641.59109,0.000169992446899414],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
> select A --match_columns t --query t1 --filter 'b != false'
[[0,1376405645.79942,0.000242948532104492],[[[1],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]],[1,"a1",true,"t1"]]]]
> select A --match_columns t --query t1 --filter '! (b == false)'
[[0,1376405649.27933,0.000178098678588867],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
> select A --match_columns t --query t1 --filter '! (_key != "a1")'
[[0,1376405653.31712,0.000149011611938477],[[[0],[["_id","UInt32"],["_key","ShortText"],["b","Bool"],["t","ShortText"]]]]]
環境
----------------
- 基本的には以前のメールと同じ環境です。
- Groonga は master から取った物と 3.0.6 で検証しています。
### 1. Mac OS X Mountain Lion 上で master をビルドした 3.0.6 ###
- 以前のメールと同じ環境で、 Mac OS X 10.8.4 で clang を使ってビルドしました。
% ../g/bin/groonga --version
groonga 3.0.6-134-gf363b06 [darwin12.4.0,x86_64,utf8,match-escalation-threshold=0,nfkc,zlib,lzo,kqueue]
configure options: < '--prefix=/Users/wm3/Desktop/groonga/g' 'CC=clang' 'CXX=clang++'>
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.8.4
BuildVersion: 12E55
% clang --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
### 2. Ubuntu 12.04 上で apt でインストールした 3.0.6 ###
- Vagrant + VirtualBox 内で構築しました。
- 3.0.4 での検証もこの環境で行っています。
vagrant @ precise64:~$ groonga --version
groonga 3.0.6 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,zlib,lzo,epoll]
configure options: < '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/groonga' '--disable-maintainer-mode' '--disable-dependency-tracking' '--with-zlib' '--with-lzo' '--with-munin-plugins' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2' 'LDFLAGS=-Wl,-Bsymbolic-functions' 'CPPFLAGS=' 'CXXFLAGS=-g -O2'>
vagrant @ precise64:~/groonga$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"
vagrant @ precise64:~/groonga$ cat /proc/version
Linux version 3.2.0-23-generic (buildd @ crested) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu4) ) #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012
--
Motoi Washida <wm3****@mail*****>