MySQLおよびPostgresの日本語全文検索に関するセミナーに参加してきましたのでそのまとめを書きます。
”2”と言いながら前回は時間が合わず参加できませんでしたので、初めての参加になります。
会場はDMM.comラボさんとなります。
場所:DMM.comラボ
東京都渋谷区恵比寿4-20-3 恵比寿ガーデンプレイスタワー21F
・MySQL
文書データの全文検索に対応したのは5.6以降のバージョンで対応
ただし、日本語の対応は5.7から対応(5.7から日本語、中国語、韓国語の対応が行われた)
全文検索を行う方法はN-gram方式とMeCab方式の2つのパターンがある。N-gram方式はデフォルトではbi-gram(2文字)となっている。
方式の違い
N-gram方式・・・文書を先頭からN文字単位で区切り、区切った文字で検索を行う
ノイズも多いが、検索の漏れが少ない
MeCab方式・・・自然言語処理を用いて単語を分割する
辞書データを元に分割するのでノイズが少ない。辞書データにないと正確に判断されない可能性がある
検索の方法は自然言語検索方式とBoolean検索方式がある。検索条件が異なる。
1)自然言語検索方式
検索トークンの和集合(OR検索)で行われる 例)日本の首都→”日本””の””首都”のいずれかが含まれている
2)Boolean検索方式
検索トークンが順番を考慮したうえで検索が行われる 例)日本の首都→”日本””の””首都”の順番で出現する
関連性の算出方法=TF-IDF値
TF値・・・対象の文書中に出現する単語の数 出現する単語の数が多いほうがスコアが高い
IDF値・・・文書集合に対する単語の出現度の数 出現する文書が少ない単語ほどスコアが高い
上の値を掛けあわせた値が総合的なスコアとなる。つまり単語が多く出現しさらに特定の文書が多い場合にスコアが高くなる。
参考ページTF-IDFでの文書内の単語の重み付け
(大学時代に自然言語処理の研究をしていたのでその時に使用していましたが、単純なのですが結構有用なスコアが取得できます)
・PostgreSQL
PostgreSQL9.6 ベータ版がリリース
全文検索→pg-bigram N-gram方式 PostgreSQLのインデックスを利用している
利用する場合はバージョンを9.4以降にする方が良い
理由
9.4でpg-bigramが仕様そいているGINインデックスの性能の改善が行われている。
弱い点
1文字検索や2文字検索検索には強いが、文字の種類が少ないデータに弱い
パラメータ設定について
1)FASTUPDATE 更新の速度が高速化する デフォルトでON
OFFにすると検索は早くなるが、インデックスの更新に時間がかかる
2)work_mem プロセスが使用するメモリー容量
3)maintenance_work_mem インデックスの構築に使用するメモリー容量
・Mroonga PGroonga
1)Mroonga
ストレージモード・・・Nullがないことが必要 インデックスおよびデータ参照すべてGroogaの機能を使用する
ラッパーモード・・・インデックス利用時のみGroogaの機能を使用する=インデックスを利用する場合のみ高速化する
トランザクションが効かないので利用する場合には注意が必要
2)PGroonga
トランザクションが効く
主キーをインデックスに入れる
search_pathを設定する
普段RDBとしてPotgreSQLを利用することが多いので、動作の検証ができれば報告したいと思います。
スピーカーの方の情報についてはイベントページからご確認いただければと思います。
MySQLとPostgreSQLと日本語全文検索2
完全にイベントとは関係ありませんが、今回のイベントで数年前に会社を退社された方に偶然会いました。
こういったセミナーに参加されているとのことですので、またどこかで会うかもしれないと感じました。