今回は検索エンジン内部のお話。
現在のWeb上の検索エンジンの特長として、デフォルトでand検索が実装されているエンジンが多数存在している。
知らない人も直感的にわかりやすく、例えば"検索 エンジン"というように2つの単語をスペースで区切ると両方の単語を含む文書が検索される仕組み。
で、今回のタイトルにある
フレーズ検索とは、も一歩踏み込んだ仕組みで、上記の例でいうと"検索エンジン"とスペースで区切らないワードの場合、"検索"のあとに"エンジン"と続いている文書をちゃんと見つけてくれるというもの。
当たり前の機能と言えばそれまでだけど、これを考えると結構大変なのである。
日本語検索エンジンの基本的な機能のひとつに
形態素解析というものがある。
この機能は簡単に言うと、ある文章の解析をお願いすると品詞単位に分けてくれる大変便利な機能。
例をあげると、"本日は晴天なり"という文章を渡すと、"本日、は、晴天、なり"と分割してくれる。
形態素解析の詳しい話は長くなってしまうので他を検索してもらうとして、多くの検索エンジンではこの分割された単語の出現した位置を記録しているファイルを持っている。(インデックスと呼ばれる)
実際に検索するときに記録した位置情報を元に文書を探すわけだが、フレーズ検索を意識している場合はそうでない場合において記録する情報も違ってくる。
まず、フレーズを意識しない場合は単語が出現した文書のみを記録する。記録の仕方はエンジンによって様々な種類があるからここでは説明無し。
次にフレーズを意識した場合は文書だけでなく、その文書のどこの位置に出現したか、というところまで情報が必要で、"検索"という単語が5文字目に出現し、"エンジン"が7文字目にあれば"検索エンジン"という単語であると判断できる。このフレーズの位置の持ち方も様々で、byte単位であったり、そもそも出現位置ではなく、2つの単語の結びつきのみ記録する場合もある。
一般的にはフレーズを意識しない方が単純な情報で済むため検索速度も速いが、検索結果に意図しない情報が含まれる可能性もあるため、より正確な結果を求める場合にはフレーズ検索を可能、または意識した検索エンジンの方が便利に使える。
前置きが長くなったが、結局何が言いたいかというと、SPeeNeeはこのフレーズ検索を実装している検索エンジンで、今回は位置情報の検索方法を変更したからスピードアップしたよ、というわけ。
具体的に説明すると、いままでファイルアクセスで参照していた位置情報をメモリ上で処理するように変更。約10000件のマッチング処理で現状のサーバでは2.0秒、これがメモリ上で処理すると0.4秒ほどに。実際には位置情報をメモリに乗っける処理も含むのでもうちょい遅くなるけど、それでも約0.8秒。
この変更のデメリットとしてはメモリ使用量の増加。現状では贅沢にも約1GBのメモリを占有している。…でもまぁケチって使わないよりはマシかな。
というわけで、めでたくスピードアップすることができました。
※使用例
"検索 エンジン"のand検索
"検索エンジン"のフレーズ検索
若干検索件数が違うのがわかると思う。