Posted at

Groongaで学ぶ全文検索2016-01-29

More than 3 years have passed since last update.


ノーマライズと全文検索の文脈での形態素解析について


ノーマライザー


  • 異なるものを論理的に同じものとして正規化するもの

    例)

    全文検索の際に

    「カレー」と「カレー」

    「りんご」と「リンゴ」

    「PC」と「パソコン」

    を同じと扱って欲しい場合などに利用。

  • インデックスを作る際と検索する際に同じものを使う事が大事

  • 「りんご」=「リンゴ」にするには検索する際に
    「りんご」が入力された場合に「(りんご OR リンゴ)」というようにクエリを作成する事でも実現できる。

    Groongaにはその機能がある、Mroongaには無いので自前のプログラムで実装する。


トークナイズする際に利用する形態素解析


  • 日本語を辞書を用いて前後の文脈を加味してキーワードを抽出する


  • 辞書を用いてキーワードを抽出する際に何パターンかに区切って一番適当と判断されたものが利用される

    例)

    渋谷/で/カレー/が/食べ/たい

    渋谷で/カレーが/食べたい

  • 辞書にはメタデータが登録されていてメタデータにある情報でどれが適当かを判断している

    例)

    渋谷,名詞,・・・

    で,助詞,先頭には来ない

    など

  • 検索する文書によって何が適当かは異なるためどの辞書を使うかなどチューニングが必要

    例)検索対象

    ・新聞

    ・tweet:省略されることが多い

    ・女子高生の会話:新しい情報が多い


  • 辞書を変更したらインデックスを作り直す必要がある

  • 辞書は最新のものに変えたくなるものなので、そのメンテナンスをどうするかも運用で問題になる

  • Groongaではジャストシステムさんが提供しているJMATという「PC」と「パソコン」が同じという情報や、
    「さしみ」と「お造り」が同じという情報を持っている辞書を利用できるプラグインがある


その他メモ

Mysqlの全文検索には下記の2種類のモードがある。

1)自然言語検索


「渋谷でカレーが食べたい」のように自然言語で検索する

デフォルトの場合や IN NATURAL LANGUAGE MODE 修飾子が指定された場合にこちらが使われる

クエリの例

SELECT * FROM articles

WHERE MATCH (title,body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);

2)ブール全文検索

*「渋谷 カレー」のように単語で検索する

* MySQLはデフォルトOR

例)

SELECT * FROM articles WHERE MATCH (title,body)

AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);


  • MySQLのノーマライザーでutf_unicode_ciを選ぶとカタカナとひらがなを同一とみなし、濁点も無視してしまう


    例)


    ブラック=ふらつく


    パパ=はは


  • Mroongaのバージョンアップはyumでできる(MySQLの再起動が必要な場合には自動で再起動するため要注意)