[groonga-dev,03715] Re: Mroongaで形態素解析とN-gramを同一のカラムに対して利用する方法について

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/




groonga-dev メーリングリストの案内