Naoya Murakami
visio****@gmail*****
2014年 4月 9日 (水) 22:07:21 JST
Mroongaユーザーの村上と申します。 開発者の方を差し置いて恐縮なのですが、以下には、ユーザーの方が教えてくれる かもしれませんって書いてあったので、勝手に書いちゃいます。 (勝手に答えられると、まずいようでしたら、ご指摘ください。) http://droonga.org/ja/community/ mroongaエンジンを使って、検索処理を実装しているのですが、 > 該当のカラムに文字が含まれているにも関わらず、検索結果に > 含まれない現象が出ており、対策方法をご存じの方がいらっしゃ > らないかと思い質問させて頂きます。 > > 検索対象カラム(下記SQLではname)の先頭にFが含まれる場合検索に > ヒットしません。 > ただし、先頭の2文字(たとえば「FA」)を指定するとヒットします。 > 二文字であればヒットし、一文字であれば、ヒットしないということは、以下が想定されます。 ・全文検索するための転置インデックスが二文字以上の長さで作られているため、一文字で 全文検索してもヒットしない。 もし、転置インデックスが二文字以上の長さで作られているのであれば、一文字でヒットしないのは、 仕様どおりの動作です(後述するエスカレーションの場合を除く)。 そのため、まず、転置インデックスがどういうルールで作成される設定になっているかを ご確認ください。確認手順は、以下の通りです。 1. 検索対象のテーブル定義を確認して、以下のURLのようにFULLTEXT INDEXのCOMMENT 句にparserを指定しているかご確認ください。指定している場合、何を指定しているか。 http://mroonga.org/ja/docs/tutorial/storage.html#how-to-specify-the-parser-for-full-text-search 2. サーバー変数mroonga_default_parserをご確認ください。1.でparserを指定していない 場合、サーバー変数mroonga_default_parserのパーサ(トークナイザ)が適用されます。 なにもいじってないなら、TokenBigramのはずです。 mysql> SHOW VARIABLES LIKE 'mroonga%'; +----------------------------------------+---------------+ | Variable_name | Value | +----------------------------------------+---------------+ | mroonga_action_on_fulltext_query_error | ERROR_AND_LOG | | mroonga_database_path_prefix | | | mroonga_default_parser | TokenBigram | | mroonga_default_wrapper_engine | | | mroonga_dry_write | OFF | | mroonga_enable_optimization | ON | | mroonga_libgroonga_version | 4.0.0 | | mroonga_lock_timeout | 10000000 | | mroonga_log_file | groonga.log | | mroonga_log_level | NOTICE | | mroonga_match_escalation_threshold | 0 | | mroonga_version | 4.00 | +----------------------------------------+---------------+ 12 rows in set (0.00 sec) もし、1.で何も指定していなく、2.のmroonga_default_parserがTokenBigramである場合、 上記URLに書いてあるTokenBigramのルールで転置インデックスが作成されます。 すなわちアルファベット数字記号は、同一字種が連続して転置インデックスが作成されます。 たとえば、カラムに格納されたテキストが「facsimile machine」の場合、転置インデックスは、 "facsimile"と"machine"で作成されます。 この場合、検索クエリが"f"や"fa"ではヒットせず、"facsimile"と書かなければ、検索にヒットしません。 ただし、ここで、以下のURLにあるように、ヒット件数が0件の場合、自動的に前方一致検索に エスカレーションします。すなわち、ヒット件数が0件であれば、"facsimile"に対して、"f"や"fa" でもヒットするようになります。 http://mroonga.org/ja/docs/reference/server_variables.html#mroonga-match-escalation-threshold TokenBigramでアルファベット1文字で確実にヒットさせたいならば、明示的に前方一致検索をすることです。 前方一致検索は、たとえば以下のような構文になります。 SELECT * FROM test WHERE MATCH(content) AGAINST('F*' IN BOOLEAN MODE); また、TokenBigramである場合、アルファベット2文字もヒットしない可能性があります。 アルファベット2文字で確実にヒットさせたい場合、TokenBigramSplitSymbolAlphaDigit等を検討する 必要があります。 もし、すでにご存知の内容で、ご期待に沿える答えでなければ、失礼しました。 以上、よろしくお願いします。 ============================== 村上 直也 twitter: @naoa_y blog: http://blog.createfield.com wiki: http://patentfield.com ============================== 2014年4月8日 17:48 大縄亮 <onawa****@milea*****>: > 初めまして。 > > mroongaエンジンを使って、検索処理を実装しているのですが、 > 該当のカラムに文字が含まれているにも関わらず、検索結果に > 含まれない現象が出ており、対策方法をご存じの方がいらっしゃ > らないかと思い質問させて頂きます。 > > 検索対象カラム(下記SQLではname)の先頭にFが含まれる場合検索に > ヒットしません。 > ただし、先頭の2文字(たとえば「FA」)を指定するとヒットします。 > > <SQL> > > select *, > MATCH (`ItemDetail`.`name`, `ItemDetail`.`size`, `ItemDetail`.`title`, > `ItemDetail`.`sub_title`, `ItemDetail`.`keyword`) > AGAINST("*W1:100,2:10,3:10,4:10,5:10 F" IN BOOLEAN MODE) AS score > from item_details as ItemDetail > WHERE MATCH (`ItemDetail`.`name`, `ItemDetail`.`size`, > `ItemDetail`.`title`, `ItemDetail`.`sub_title`, `ItemDetail`.`keyword`) > AGAINST("*W1:100,2:10,3:10,4:10,5:10 F" IN BOOLEAN MODE); > > よろしくお願いします。 > -- > ━━━━━━━━━━━━━━━━━━━━━━━━━━ > 大縄 亮 > onawa****@milea***** > 株式会社 マイレージテクノ > 〒530-0044 > 大阪市北区東天満1丁目10-14 MF南森町2ビル9階 > 電話 06-6360-4834 > FAX 06-7635-5027 > http://www.mileage-techno.com > ━━━━━━━━━━━━━━━━━━━━━━━━━━ > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev >