背景
久しぶりに勉強会参加してきました。
というのも、来週のいい肉の日(11/29)にGroonga Meetup 2015で登壇させて頂くことになり、焦って勉強しなきゃ!全文検索!ということで参加しました。
- Groonga Meetup 2015
https://groonga.doorkeeper.jp/events/31482
あと30人くらい参加枠があるみたいです。会場はぐるなびさんで、美味しい肉が食べられるみたいです!
都合が良い方は是非!
勉強会で学んだこと
全文検索とは
- 文章を検索したいってニーズは誰にでもあります
- だけど、検索対象の文書が大量だと大変
- そこで、インデックス作って効率的に検索するのが全文検索
インデックスってなに?
-
からくり
- インデックス自体はキー・バリューストア
- キー・バリューのキーに対して検索する
- キーに入ってるものだけYesとして、それに対応するバリューを返す(※これ重要)
- 因みにバリューには結果の文書に対するIDのリストが入ってる
-
検索キーワードが英語の時
- 単語単語で区切ってキーに登録していく
- 英語は文章が単語で区切られてるからスマート
- 例えば、This is a pen の時、キーにする区切りがわかりやすいでしょ?
-
検索キーワードが日本語の時
- 例えば東京都だと、東京・京都 だったり区切るところわかりずらい
- 割りと大変、いや凄い大変
- そこでアプローチが2つある
日本語検索のアプローチ
1 英語と同じく単語をキーワードにする
- 例えば「花が咲いた」の時、花・が・咲いたをキーにする
- 形態素解析 → MeCab
2 なんでもキーワードにしちゃう
- 例えば「花が咲いた」の時、花が・が咲・咲い・いた・た花・花が・が咲とか何でもキーにする
- N-Gram
- 2バイトでとるのは、2gram(バイグラム)、3バイトは3gram(トリグラム)、バイグラムはバイリンガル(倍ってことじゃないよ!)のバイ、トリグラムはトライアングルのトリ
日本語の何が大変なんだっけ?
-
1は超大変。例えば「すももももももものうち」どこで切ればいいの。。。
-
だから2がある
-
例えば「咲いた」を検索する場合、「咲い」・「いた」のアンドとれば咲いた引ける
-
でも、まだまだ問題がある
-
キーワードが「花が咲いていた」の場合、「咲い」・「いた」のアンドでYesになるけど「咲いた」ないよね。。誤検索 \(^o^)/オワタ
-
なので、さらに隣り合ってるかってのも見なきゃいけない罠がある。
-
隣り合ってるか問題の解決方法としては、値の中に何番目にあったかを値に入れとくやり方と初めの検索ではちゃんと見ないで怪しいのピックアップしたあとに、ちゃんと見るやり方がある
- それをフレーズ検索という
- google検索でいうところの、ダブルクォーテーションで囲った場合の検索
気になる性能面
- 上記で推測すると、2のNgramはインデクシング簡単だけど、検索遅そう、1の形態素解析はインデクシング大変だけど、検索早そう。
- 性能面が気になるので、ググッてみました。
- ざっと調べた感じだとMroonga/GroongaのMeCabトークナイザの全文検索性能についての記事がわかりやすい
- Mecabの場合、「〜の」とか助詞が頻出して容量圧迫する割に検索に寄与しないので、頻出語句がある場合とない場合で計測してるようです
- 頻出語句さえ除けば、MeCabトークナイザは、インデックスサイズをコンパクトに抑えつつ、Bigramトークナイザ、Trigramトークナイザよりもかなり高い検索性能が得られていることがわかります。
- Mecabで問題は検索漏れがあるみたいですが、Mecabの検索漏れを減らす場合、IPADic辞書より、UniDic辞書の方が良いって書いてありますね
自身がMecabで困ってたこと
-
たまに「mecab_sparse_tostr() failed len=XXX err=too long sentence.....」ってエラー出てた
-
おかげでインデックス処理が落ちて、、ダメマーク付けて再インデックスするという不毛な処理を入れて回避してた
-
その場合、対象文書はインデックスにすら入らない状態になってる
-
原因は、モノには限界がある
- big文書で改行とかの問題で解析長いとリソース溢れてエラー
-
最近長い時にプチッと切るオプションが追加された
- plugins/tokenizers/以下のソースを環境変数キーワードに漁ったら見つかるよと(後で漁る)
今後の話
- 物事やるときは、本質知らないとですね。今回全文検索のからくり部分をしれて、とても勉強になりました。
- この勉強会の趣旨(学習したことを自分の言葉で即アウトプット)もとても素晴らしいと思いました。
- 自分としては、今後もownCloudとMroongaのコラボで全文検索について勉強していかないといけないと思ってます。
- 形態素解析とか、辞書とか、ドリルダウンとか使いこなせれば、現状のソリューションも利用価値が上がっていくのだろうと
- 技術的要素としては、ownCloudのO/Rマッパー(Doctrineベース)をMroongaに対応させていったり(もうあるかもだけど)
- Ansibleでさくっと構築とか、これは普通に行ける(半分やってる)
- 因みに、最新バージョンのownCloudで自身で作った全文検索機能が動いてなかったり(ownCloud側の問題)、、先にそこFixしないと。。
- といったところで、この勉強会に今後も参加させて貰えればなと思います。