技術ブログ

サイト内検索 API Mitsume の4月から改善された点

author: yterajimadate: 2016-05-21tags: mitsume, golang

e2esound.com で開発中のサイト内検索 API 「Mitsume」の過去1ヶ月における改善点をまとめます。残念ながら Mitsume の機能はまだ一般公開されていないのですが, 1人で設計1人で実装しているため自分のモチベーションを維持するために書いています。正確には4月の基本機能公開から GW 終了までの改善点, 追加機能や反省についてです。

改善点

  1. Search API のレスポンスタイム改善
  2. 各 API ごとに Benchmark テストを追加し変更前後の比較を可能に

大きな改善点として Search API のレスポンスタイムを大きく改善しています。改善前は 0.2 sec 程度 API 側の処理時間が必要でしたが改善後は 0.01 〜 0.15 sec 程度になっています。ブラウザの表示までの時間を計測すると 150msec 〜 200msec 程度になったので十分実用的なレベルになったと言えると考えています。

※現動作しているAPI サーバは DigitalOcen シンガポールリージョン メモリ 1G です

追加機能

  1. クローラのコンテンツフィルタ機能
  2. Search API の JSONP 対応

1 のコンテンツフィルタについては, 各ページ共通コンテンツを除外できる機能です。具体的には CSS のセレクタで HTML タグや class で特定部分を検索対象から除外することができるようになりました。

例えば現在御覧頂いている e2esound.com および技術ブログでは各ページの header, footer は重複するコンテンツなのでサイト内検索からは除外したいパーツになります。この除外したい部分を指定できるようになりました。検索ページ では headerfooter を除外指定しています。より Web サイトのユーザに対して必要な 部分だけ を検索していただくための機能です。

2 の JSONP 対応は, 少し古い Web ブラウザでも検索結果を取得できるようにした機能追加です。公開直後は CORS 対応の JSON レスポンスのみ対応していましたが一部の Web ブラウザでは検索結果を取得することができませんでした。現在では Search API のレスポンスは CORS の JSON レスポンスまたは JSONP のどちらかが選択できます。

反省点

以上の改善や機能追加について大きな反省点があります。それは Benchmark テストを初期に追加しておくべきだった というところです。

Go 言語にはテスト機能にデフォルトで Benchmark テストが用意されています。例えば Search API に対しては次のテストで書くことができます。

func BenchmarkSearchHandler(b *testing.B) {
    ts := httptest.NewServer(&searchHandler{})
    defer ts.Close()
    keyword := "hoge"
    url := searchURL(ts.URL, UUID, keyword)

    for i := 0; i < b.N; i++ {
        res, _ := http.Get(url)
        res.Body.Close()
    }
}

この Benchmark テストがあれば変更内容や機能追加時に性能の比較ができます。このテストが用意されておらず負荷ツールで API 処理の比較を行っていたため正しい選択ができず 2 日ほど時間を無駄にしてしまいました。API を開発する際には Handler ごとに実装初期から Benchmark テストを追加すべきです。

これから

4 月の基本機能公開時点では, 現在管理画面および管理機能を実装する予定でした。特に API に不備が多く変更や改修で大きく時間をとってしまい未だ着手できていない状態です。API とクローラ機能の開発は一旦停止し, これから管理画面と管理機能の実装を行っていく予定です。