[groonga-dev,00981] Re: mroonga検索スコア順のソートについて

Back to archive index

磯部 和広 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 ~]$




groonga-dev メーリングリストの案内
Back to archive index