[groonga-dev,00846] Re: mroongaでの分かち書き検索方法を教えて下さい

Zurück zum Archiv-Index

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/




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index