Kimura A
a.kim****@live*****
2014年 7月 9日 (水) 20:56:34 JST
木村です。再三すみません。
ご示唆いただいた内容にそってテストしてみたところ、問題が発生したのでご報告します。
問題の内容は、コメントに「'type "kana_names"」などと指定したVARCHARカラムに対して、前方一致検索が効いていない(ように見える)というものです。
環境はWindows版、MariaDB 10.0.11です。
テストはCakePHPのファイル上から行っています(Windowsなのでコマンドラインだと文字化けすることと、JSONデコードした結果を整理して表示したいことが理由です)。
テスト用のコードは以下のような感じで、CakePHPのAppController.php内に書いています。
$this->ModelName->query('use test;');
$r = $this->ModelName->query("
SELECT mroonga_command(\"select t1 --limit 10 --query kana_name:^と\") AS result;
");
print_r(json_decode($r[0][0]['result'], true));
exit;
コード中にある$this->ModelName->query()は、DBに生のクエリーを送り、結果を取得するためのメソッドです。
実際にMySQLに送られているクエリーだけを取り出すと、以下のようになっているはずです。
use test;
SELECT mroonga_command("select t1 --limit 10 --query kana_name:^と") AS result;
当初はドリルダウンのクエリーに--queryを加筆してテストしていて、挙動が思わしくないので削っていくうちに、ドリルダウンには関係なく問題が発生していることに気づきました。
テスト用のtestデータベースには、以下のような構成になっています。
3つのテーブルのうち、t1テーブルとt2テーブルはほぼ同一の内容で、kana_nameカラムのコメントに「'type "name_kanas"」表記がある(t1)かない(t2)かだけの違いです。
このt1、t2テーブルに対して、同一のクエリーを送ると、取得されるレコードに違いが出てきてしまいます。
CREATE TABLE IF NOT EXISTS `kana_names` (
`kana_name` varchar(512) NOT NULL,
`kana` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`kana_name`)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `t1` (
`id` int(11) NOT NULL auto_increment,
`kana_name` varchar(255) DEFAULT NULL COMMENT 'type "kana_names"',
PRIMARY KEY (`id`)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `t2` (
`id` int(11) NOT NULL auto_increment,
`kana_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
INSERT INTO `kana_names` (`kana_name`, `kana`, `name`) VALUES
('/トム', '', 'トム'),
('じぇりー/ジェリー', 'じぇりー', 'ジェリー'),
('じゅうむ/十夢', 'じゅうむ', '十夢'),
('とむ/トム', 'とむ', 'トム'),
('とむ/十夢', 'とむ', '十夢'),
('みっきー/ミッキー', 'みっきー', 'ミッキー');
INSERT INTO `t1` (`kana_name`) VALUES
('とむ/トム'),
('じぇりー/ジェリー'),
('とむ/十夢'),
('みっきー/ミッキー'),
('とむ/トム'),
('じゅうむ/十夢'),
('/トム');
INSERT INTO `t2` (`kana_name`) VALUES
('とむ/トム'),
('じぇりー/ジェリー'),
('とむ/十夢'),
('みっきー/ミッキー'),
('とむ/トム'),
('じゅうむ/十夢'),
('/トム');
以下に、これらのテーブルに対して走らせてみたクエリーと結果(件数のみ)を列挙します。
クエリー:t1に対して完全一致
SELECT mroonga_command("select t1 --limit 10 --query kana_name:とむ/トム") AS result;
結果
2件取得:正常
クエリー:t2に対して完全一致
SELECT mroonga_command("select t2 --limit 10 --query kana_name:とむ/トム") AS result;
結果
2件取得:正常
クエリー:t1に対して前方一致
SELECT mroonga_command("select t1 --limit 10 --query kana_name:^と") AS result;
結果
0件取得:異常?
クエリー:t2に対して前方一致
SELECT mroonga_command("select t2 --limit 10 --query kana_name:^と") AS result;
結果
3件取得:正常
この3番目のクエリーが問題で、どうも「コメントによって外部テーブルと紐付けたVARCHARカラムに対しては、前方一致検索が効いていない」という挙動のように見えるのですが…。
これと同じことが、ドリルダウンのクエリーに--queryを加筆した際にも起きてしまい、思うような結果を取得することができませんでした。
ご確認、どうぞよろしくお願いします。