Sennaのクエリ書式がよくわかりません
第四十四回
最近,Ludiaを使ってデータベースの全文検索を行っているのですが,Sennaのクエリ書式がよく分かりません.というか,MySQLのBOOLEAN MODEがよく分かってないのかもしれません.
test=# select *from table1; col1 | col2 ------------------------------+-------------------- すもももももももものうち | あの壺はよいものだ ももから生まれた桃太郎 | あの壷はよいものだ ももんが飛んだら木が揺れた | あの壺は悪いものだ あなたももうけ話が聞きたいの | あの壷は悪いものだ 昨夜もももの缶詰を開けた | この壷はよいものだ にわにはにわにわとりがいる | この壺はよいものだ (6 rows)
こんなLudiaのテスト用テーブルがあるとき,以下のようなクエリを投げると結果がおかしい?というか納得いかないものになります.
test=# select *from table1 where col2 @@ '*D+ あの よい OR もの'; col1 | col2 ------------------------------+-------------------- すもももももももものうち | あの壺はよいものだ ももから生まれた桃太郎 | あの壷はよいものだ ももんが飛んだら木が揺れた | あの壺は悪いものだ あなたももうけ話が聞きたいの | あの壷は悪いものだ 昨夜もももの缶詰を開けた | この壷はよいものだ にわにはにわにわとりがいる | この壺はよいものだ (6 rows) test=# select *from table1 where col2 @@ '*D+ あの よい OR 壺'; col1 | col2 --------------------------+-------------------- すもももももももものうち | あの壺はよいものだ ももから生まれた桃太郎 | あの壷はよいものだ (2 rows) test=# select *from table1 where col2 @@ '*D+ あの よい OR 壺は'; col1 | col2 ----------------------------+-------------------- すもももももももものうち | あの壺はよいものだ にわにはにわにわとりがいる | この壺はよいものだ ももんが飛んだら木が揺れた | あの壺は悪いものだ ももから生まれた桃太郎 | あの壷はよいものだ (4 rows)
単純な AND と OR だけの書式なんですが,「壺」と「壺は」で結果が違うのはなぜなんでしょうか.
もしかすると,形態素解析に利用しているMeCabの語の区切り方のせいなのでは,と思ってmecabで解析してみるとこんな風になります.
$ mecab あの壺はよいものだ あの 連体詞,*,*,*,*,*,あの,アノ,アノ 壺 名詞,一般,*,*,*,*,壺,ツボ,ツボ は 助詞,係助詞,*,*,*,*,は,ハ,ワ よい 形容詞,自立,*,*,形容詞・アウオ段,基本形,よい,ヨイ,ヨイ もの 名詞,非自立,一般,*,*,*,もの,モノ,モノ だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ EOS
うーん,解析はうまくいってるようです.わからない.もしなにかお分かりになる方はコメントなどいただけると幸いです.
環境
- PostgreSQL 8.1.8
- Senna 1.0.1
- MeCab 0.93
- Ludia 1.0.0
追記(2007/03/24 00:30)
Senna開発者のid:tasukuchanさんから直々にコメントとトラックバックで解説をいただきました.少し長めですが引用させていただきます.
「これ OR 壺」といったクエリを実行した場合を考えます。
まず、「これ」というトークンを含む文書を検索します。
2文字のトークンなので、検索結果が存在します。
次に、「壺」というトークンを含む文書を検索します。
1文字のトークンなので、検索結果が通常は存在しません。
そして、2つの検索結果をORでつなぐと、
結局「これ」というトークンを含む文書セットが結果となってしまいます。
その検索結果件数は0ではないので、部分一致検索が行われることがなく、
そのまま検索結果を出力してしまいます。
詳しくは引用元のエントリに記載されていますので,ご覧ください.id:tasukuchanさんありがとうございました.