Kouhei Sutou
kou****@clear*****
2015年 12月 4日 (金) 11:23:51 JST
須藤です。 In <CADLFF-WyTB6fRnNda=6ky2e****@mail*****> "[groonga-dev,03714] Mroongaで形態素解析とN-gramを同一のカラムに対して利用する方法について" on Thu, 3 Dec 2015 18:38:17 +0900, keizi murakami <murak****@gmail*****> wrote: > 初歩的な内容で大変申し訳ございませんが、 > 質問させていただきます。 大丈夫です!初歩的ではありません! > ■ 質問1 > mroonga_commandを利用した方法を試しておりますが、シンタックスエラーが > 発生しております。 > どのような記述にすれば、期待した動作になるのでしょうか。 > (名前にハイフン入りのテーブルをmatch_columnsで指定する方法に、問題があ > りそうなのですが・・・) はい、その通りです。match_columnsではハイフン入りの名前を指 定できないのです。 では、どうしてハイフン入りにしたのかというと他の文字と重複し ないようにするためです。その代わり、match_columnsでは指定で きなくなるのですが、それはしょうがないと割りきりました。 が、それだとアレなので、ハイフンではなくシャープを区切りにし ようと思います。 > ■ 質問2 > mroonga_commandではなく、SQLを利用しTokenMecabとTokenBigramを同時に使 > 用する方法はありますでしょうか。 > > USE INDEXを用いて、SELECT文を2回実行した結果(スコア)を合算する方法や、 > 同じ値を持ったTokenMecab用とTokenBigram用のカラムを別に用意する方法は > あったのですが、 > あまりしっくり来る方法を見つけられておりません。 強引なのですが、これで動きます。 ---- CREATE TABLE bigram ( token VARCHAR(10) PRIMARY KEY ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4 COMMENT='default_tokenizer "TokenBigram" normalizer "NormalizerAuto"'; CREATE TABLE mecab ( token VARCHAR(10) PRIMARY KEY ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4 COMMENT='default_tokenizer "TokenMecab" normalizer "NormalizerAuto"'; CREATE TABLE data ( content text, FULLTEXT INDEX bigram_index (content) COMMENT 'table "bigram"', FULLTEXT INDEX mecab_index (content) COMMENT 'table "mecab"' ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4; INSERT INTO data VALUES ('私の名前は中野です。'); SET mroonga_boolean_mode_syntax_flags = "SYNTAX_SCRIPT"; SELECT content, MATCH (content) AGAINST ('query("bigram.bigram_index * 3 || mecab.mecab_index * 10", "中野 OR 名")' IN BOOLEAN MODE) FROM data WHERE MATCH (content) AGAINST ('query("bigram.bigram_index * 3 || mecab.mecab_index * 10", "中野 OR 名")' IN BOOLEAN MODE); -- 私の名前は中野です。 16 ---- 最後が結果なのですが、スコアーが16になっています。「中野」が bigramでもmecabでもヒットするので1 * 3 + 1 * 10 = 13で、 「名」がbigramでしかヒットしないので、合わせて13 + 1 * 3 = 16 になります。 ポイントは次の通りです。 * インデックスのテーブルにハイフンがつかないテーブルをつけ る(自分でテーブルを作成してインデックスからtableで参照) * mroonga_boolean_mode_syntax_flags = "SYNTAX_SCRIPT" にしてIN BOOLEAN MODEでスクリプト構文を使えるようにする。 http://groonga.org/ja/docs/reference/grn_expr/script_syntax.html * query関数を使ってMroongaからmatch_columnsを指定する。 http://groonga.org/ja/docs/reference/functions/query.html -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/