Kouhei Sutou
kou****@clear*****
2012年 5月 11日 (金) 23:29:32 JST
須藤です。 In <4FAD0****@rozet*****> "[groonga-dev,00845] mroongaでの分かち書き検索方法を教えて下さい" on Fri, 11 May 2012 21:16:05 +0900, 磯部 和広 <k-iso****@rozet*****> wrote: > 下記のように、「引火性」「液体」とトークナイズしてあるのに、 > トークンではなく前方一致でのマッチとなっています。 これはgroongaが検索するときに複数の検索方法を組み合わせている からです。ざっくり言うと、完全に一致するレコードがヒットしな かったら少しずつゆるい条件にしながら検索します。 参考: 検索の挙動について http://groonga.org/ja/docs/spec/search.html > [k-isobe @ PMJ-DB1 ~]$ for s in 引火性 引火 引 火性 火 性 液体 液 体 性液 > ; do echo "select '$s', count(1) from test_data where > match(japanese_splitted) against ('$s');"; done | mysql -u root test -N > 引火性 1 > 引火 1 > 引 1 > 火性 0 > 火 0 > 性 0 > 液体 1 > 液 1 > 体 0 > 性液 0 > [k-isobe @ PMJ-DB1 ~]$ 今回の例では、「引火性」と「液体」の場合のみ完全一致検索でヒッ トします。それ以外の時は完全一致検索ではヒットしないので、前 方一致検索をします。例えば、「引火」や「引」は完全一致検索で はヒットしませんが、前方一致検索ではヒットするので、最終的に はヒットします。 なお、この挙動を確認したい場合は、 mysql> SET GLOBAL mroonga_log_level = DEBUG; というようにログレベルをあげて、 mysql> select ... match(japanese_splitted) against ('引火'); というように検索してください。 ${MySQLのデータディレクトリ}/groonga.logに 2012-05-11 22:48:47.924024|i|7f6ce700|grn_ii_sel > (引火) 2012-05-11 22:48:47.924106|i|7f6ce700|exact: 0 2012-05-11 22:48:47.924241|i|7f6ce700|n=1 (引火) 2012-05-11 22:48:47.924326|i|7f6ce700|unsplit: 1 2012-05-11 22:48:47.924347|i|7f6ce700|hits=1 というようなログがでるはずです。 exact: 0 が完全一致検索では1つもレコードが見つからなかったことを表し ています。 unsplit: 1 が前方一致検索で1件ヒットしたことを表しています。 hits=1 が最終的にヒット数が1だということを表しています。 > どのようにしたら、空白区切りでトークナイズされたデータに対し > 該当するトークン「だけ」マッチするように出来るでしょうか。 少し面倒なのですが、 groongaを--with-match-escalation-threshold=-1付きでconfigure してビルドするとそのような挙動にできます。 参考: match_escalation_threshold http://groonga.org/ja/docs/commands/select.html#match-escalation-threshold この場合、groonga.logは以下のようになり、完全一致で1件もヒッ トしない場合でもそれ以上検索しなくなります。 2012-05-11 23:26:30.517740|i|933d9700|grn_ii_sel > (引火) 2012-05-11 23:26:30.517807|i|933d9700|exact: 0 2012-05-11 23:26:30.517835|i|933d9700|hits=0 ただ、それでは大変だと思うので、以下のように動的に match-escalation-thresholdの値を変えられるようにしておきます! mysql> SET mroonga_match_escalation_threshold = -1; -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) プログラミングが好きなソフトウェア開発者を募集中: http://www.clear-code.com/recruitment/