お手軽転置インデクスを用いた検索エンジン: (2) なんちゃって検索サーバ編
前回に続き,なんちゃって検索エンジンを作ってみます.
ネットワークプログラミングをやりたかった理由のひとつが,検索エンジンをデーモンとして立ち上げておけば,ソケット通信で検索クエリの入力,結果の取得ができるじゃん.と思ったから.
入門の入門で色々つまづいたので,とりあえず一番簡単なサーバ・クライアント型のプログラムを作ってみた.前回作成したお手軽インデクスでAND検索をしてくれるコードを利用して,入力されたクエリに対する検索 (複数の場合はAND検索) をしてくれる.
インデクス方式については前回を参照.
サーバを立ち上げる
% ./server ./server listening port ...
クライアントを立ち上げて,クエリを投げる
% ./client input query > hoge fuga search results: 1 4 5 input query > piyo search results: 4 5 input query > baa search results: Index NOT found. input query > foo bar search results: No result found.
クエリが入力されるとサーバを立ち上げた端末の標準エラー出力に検索処理が出力される.お手軽インデクスは,入力されたクエリに該当するファイル名の転置リストファイルを読み込んで,結果を出力するという原始的な方法.
% ./server ./server listening port ... Received query: hoge fuga Input query num: 2 filename=./index/hoge Read index from ./index/hoge done. filename=./index/fuga Read index from ./index/fuga done. inverted lists for input query === hoge -> 5: 1 2 3 4 5 fuga -> 3: 1 4 5 ordered list=== fuga -> 3: 1 4 5 hoge -> 5: 1 2 3 4 5 Intersection of fuga and hoge: 1 4 5 search result === result num: 3 result_buff=1 4 5 ...
わーい,動いたー!
ソースコードはGitHubに置いておきました.特に面白い部分はないのですが.
Cのソケットだとうまく動くのですが,Perlのソケットプログラムを書いたら,なんだか挙動がおかしい.すぐに修正できなかったので,後回しにしよう.
だんだんと検索エンジンらしくなってきました.まだなってないか.こうやってひとつのプログラムを育てていく経験がないので,わくわくしています.
不定期で続く
TODO
- 近いうち
- デーモンにして常駐できるようにする.
- 起動の際にインデクスをあらかじめメモリに読み込んでおく.
- そのうち
- インデクス構築
- 本文情報の保存とスニペットの表示
- 転置リストの格納方法のちゃんとした検討