磯部 和広
k-iso****@rozet*****
2012年 7月 6日 (金) 14:19:27 JST
いつもお世話になっております。 >今試していてわかったのですが、ORDER BY句を指定すると、 >そのカラムにキーワードが含まれていないデータは除外されているようです。 はい、その通りです。 >例えば(7)では、title・author・publisherの全てに"日本"が含まれているもの >しかマッチしていないと思われます。 >またその証拠に、(3)と(8)では同じ検索結果が得られています。 いいえ、それは違います。 (order by 句の)MATCH AGAINSTで指定したカラムにヒットするものだけが出力 されます。 ※これはmroongaの仕様ではなく、MySQLのMATCH AGAINSTの仕様です。 http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html 下記、テストのエビデンスです。 [k-isobe @ PMJ-MySQL1 ~]$ SQL1="SELECT id,title,author,publisher FROM book2 WHERE MATCH(title,author,publisher) AGAINST('日本' in boolean mode)" [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1" 1 日本の心 日本人 大日本出版 2 宇宙人の心 日本人 大宇宙出版 3 ルーピーの心 鳩山 大日本出版 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY MATCH(title) AGAINST('日 本' in boolean mode)" 1 日本の心 日本人 大日本出版 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY MATCH(author) AGAINST('日 本' in boolean mode)" 1 日本の心 日本人 大日本出版 2 宇宙人の心 日本人 大宇宙出版 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY MATCH(publisher) AGAINST('日本' in boolean mode)" 1 日本の心 日本人 大日本出版 3 ルーピーの心 鳩山 大日本出版 [k-isobe @ PMJ-MySQL1 ~]$ 下記のように、検索自体はfull_book_title_author_publisherインデックスが使 用されますが order by で使用しているMATCH AGAINSTが、その仕様として マッチするものだけを通す となっているので、マッチしないレコードは出力されなくなります。 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "explain $SQL1 ORDER BY MATCH(publisher) AGAINST('日本' in boolean mode)" 1 SIMPLE book2 fulltext full_book_title_author_publisher full_book_title_author_publisher 0 1 Using where with pushed condition; Using filesort [k-isobe @ PMJ-MySQL1 ~]$ ちなみに、下記のようにマッチしない場合の救済策を講じても マッチしなかったレコード自体が帰らないので無理でした。 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY case when MATCH(publisher) AGAINST('日本' in boolean mode) then MATCH(publisher) AGAINST('日本' in boolean mode) else 0 end" 1 日本の心 日本人 大日本出版 3 ルーピーの心 鳩山 大日本出版 [k-isobe @ PMJ-MySQL1 ~]$ また、サブクエリーも試したのですが、サブクエリーに対してFULL TEXT検索は 出来ませんでした。 ところで。 下記のように、+演算子は指定できますが、-演算子が使えないようです。 何でなんでしょうね・・・ 一応、下記も調べたのですが、そのような制約の存在は見当たりませんでした・・・ http://mroonga.github.com/ja/docs/index.html 下記、演算子のエビデンスです。 [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY MATCH(publisher) AGAINST('-日本' in boolean mode)" ERROR 1064 (42000) at line 1: failed to parse fulltext search keyword: <-日本>: <Syntax error! (-日本)> [k-isobe @ PMJ-MySQL1 ~]$ do_sql "$SQL1 ORDER BY MATCH(publisher) AGAINST('+日本' in boolean mode)" 1 日本の心 日本人 大日本出版 3 ルーピーの心 鳩山 大日本出版 [k-isobe @ PMJ-MySQL1 ~]$