Posted at

Groongaで学ぶ全文検索2016-03-11

More than 3 years have passed since last update.


実運用を想定した全文検索

ショッピングサイトを例にする

以下のような構成のサイトに全文検索を導入する場合

全文検索用にMySQLのスレーブを増やしMroongaを利用する形にすると、

データの登録について考える必要が無くなり手軽に全文検索を開始できる

※MroongaはMySQLのプラグインとして動的にロードして利用することができる

GroongaをベースとしたMySQLのストレージエンジン

管理画面商品登録


MySQLにデータ格納

API

サイトに商品表示

goodsテーブル

id
name
kana
explain

1
ひこ孫 純米吟醸7号酵母版
ひこまごじゅんまいぎんじょうななごうこうぼ
このひこ孫純米吟醸には2つのバージョンがあり、これは7号酵母版です。華やかさはなくても、しっとりと落ち着いた味わいが7号酵母の特徴。そして、お燗にして味わいが広がるのも、7号酵母の特徴です。神亀の個性はありながらも、しっとりと落ち着いた味わいは、幅広い料理を受け止めてくれます。一般的には9号酵母版が出回っていますが、これは蔵元さんが「俺の晩酌用に造るんだ」とのことで、お気に入りの7号酵母で造られています。

2
ひこ孫 純米吟醸9号酵母版
ひこまごじゅんまいぎんじょうきゅうごうこうぼ
このひこ孫純米吟醸には2つのバージョンがあり、これは9号酵母版です。最近の神亀には驚かされますが、これもその一つ。以前の神亀からは想像も出来ないような、品のある味わいです。とはいえ、神亀らしい旨味とコクはそのまま残っていますが、開けたてよりも一週間ほど放置すると、米の旨味はそのままでシャープな味わいが出てきます。冷やはもちろん、お燗もお勧めです。

3
天遊琳 秘蔵純米古酒 2003
てんゆうりんひぞうじゅんまいこしゅにせんさん
時を超えた優しい古酒の米の旨みに癒されます


ユーザーが探したいものをわかっている場合

例)

日本酒の特定銘柄(今回の例では神亀酒造のひこ孫)が欲しいユーザー

→入力フォームに欲しいキーワードを入力させる

その際には下記のようにBOOLEAN MODEを利用する(*D+でand検索)

SELECT * FROM goods WHERE MATCH(name) AGAINST("*D+ ひこ孫 酒造" IN BOOLEAN MODE);

SELECT * FROM goods WHERE MATCH(name) AGAINST("*D+ {ユーザーの入力}" IN BOOLEAN MODE);


  • 入力フォームに「ひこ」と入力したら「ひこ孫」と入力補完する機能もMroongaでできる



ユーザーが探したいものをわかっていない場合

例)

日本酒が欲しいけれど何が欲しいかわからないユーザー向け

→商品説明を類似文書検索し似ている商品を出す

その際は下記のようにNATURAL LANGUAGE MODEを利用する。

SELECT * FROM goods WHERE MATCH(explain) AGAINST("{見ている商品の商品説明}" IN NATURAL LANGUAGE MODE);


  • NATURAL LANGUAGE MODEを利用すると

    1)重要そうなトークンの上位N件を抽出

    2)ORで検索

    3)重要なものが多く含まれる文書を似た文書と判断して上位に表示

    というような処理で類似文書を検索できる

  • 重要そうなトークンの判断には含まれている文書が少ないものが重要と判断している

  • 転置インデックスからトークンが含まれる文書数を取得している

  • 類似文書検索をする場合にはトークナイザーにMecabを利用すること

    →自然な日本語で区切らないと大事なキーワードがわからなくなるため

    例)

    「日本酒万歳」をバイグラムでトークナイズすると
    「酒万」と意味が通じない単語もでてきてしまうが「酒万」が存在する文書が少ないと
    重要なトークンとして判断されてしまう

    日本

    本酒

    酒万

    万歳