社内向けの横断検索エンジンをつくった話
社内で抱えていた問題
歴史がそこそこあって、会社が持っている情報(社内ドキュメント数)が膨大。
ザクっと試算したが、1000万くらいは余裕でありそう。(億はないと信じたい・・・)
それらがNASやらSharePointやらウェブシステムやらに分散配置されていて、アクセスコストが大きすぎることが問題。
つまり、ほしいドキュメントを探すのがとても大変。
1つのドキュメントを探すのに30分や1時間かかる場合もあるし、見つからない場合もある。
なによりストレスフル。
解決へのアプローチと効果
ドキュメントの配置マップを作っている先輩がいて、入社して間もない頃はとてもお世話になった。
ただ、数が数なので人手を介すと整備が追いつかず、陳腐化していた。
もっと機械的な手法で臨む必要があるため、検索エンジンにチャレンジすることにした。
正直、Googleライクな検索でほしいドキュメントがサッとでてきたら嬉しい。
それに検索はやったことがない分野なのでおもしろそうでもある。
効果については、かなり控えめな条件で試算した。
それでも1日で500万円、1ヶ月で1億円、1年で12億円の人件費圧縮が可能。
やらない理由がない。
・社員:約10,000人
・社員時間単価:2,000円/時
・もの探し短縮時間:15分/日
お金の話も大切だけど、それ以上にドキュメント探しなんて無駄なことに時間を割かないで、本来やるべき価値ある仕事をみんなにしてほしい。
制約
■仕事として認められない
こういったボトムアップの提案は往往にして却下される。
通常業務に影響が出ないように、昼休みの1時間を使うことにする。
お昼に自席でもぐもぐしながら、2ヶ月(40時間)くらいで構築完了。
■サーバがない
仕事として認められない以上、稟議が通らずサーバは調達できない。
admin権限なしのWindows PC 1台を手に入れるのがやっとだった。
システム制約が大きすぎたけど、以下の構成でクリア。
メモリ等のハードリソースはぎりぎり。
・基盤
幸いJDKはプリインストールされていたのElasticseachを採用。
・クローラー
社内環境に合わせて作り込む必要があったので、フルスクラッチ。
言語の選択肢は、JavaかPowershellかVBscript。
JavaはIDEを会社に剥奪されてテンションが下がってた直後だったので、Powershellを採用。(後悔)
・フロントエンド
クローラーを書くのが重かったので、Fessを採用して省略。
結果と工夫したこと
・10万以上のドキュメントをインデクシングし、全文検索を可能とした
・利用者から「便利」という言葉をいただく、すこぶる楽しい
・クローリング先に合わせて、インデックス対象情報は正規表現でガチガチに絞った(最初は全部対象にしていたが検索精度が悪すぎた)
・社内インフラのリソースが貧弱なので、節度をもったクローリングを心がけた(5秒1リクエスト)
嵌ったところ
・認証が必要なサイトのクローリング(パケットキャプチャして再現するのがなんだかんだ早い)
・クライアントレンダリングサイトのクローリング
・Windowsの独特なところ(パスとかエスケープシーケンスとか)
今後の展望
・クローリング先を増やす(まだ全体の1/100)
・環境構築の承認をとって、クローラーはpythonかnode.jsで書き直したい
・予算をとってサーバで運用したい
・クラスタ構成にして並列化したい
・社内用語がそこそこあるので、形態素解析用の辞書を作成し精度を上げたい
・ユーザの利用履歴を蓄積し分析することで、検索情報に重み付けをしたい