GameWith Developer Blog

GameWith のエンジニア、デザイナーが技術について日々発信していきます。

ゼロベースからPHP 7.2 + Elasticsearch 6.2 を使って検索機能をリリースするまで

GameWith のサーバサイド兼フロントエンドエンジニアの めもりー (@m3m0r7) です。

8月のブログリレーに参加したかったのですが、表題の検索機能のリリースに追われてて参加できませんでした 😥

開発に約1.5ヶ月ほど要して、大きな一つの機能である「検索機能」をまだアプリのみですが、先日、先行リリースしました 👏

この開発はサーバサイドが主だったため、フロントエンドが恋しくなってしまいました。React触りたい…。

f:id:m3m0r7:20180919172644j:plain

開発メンバー

開発メンバーは弊社の開発部部長が主にコードレビュー担当、インフラの細かいチューニングを行ったのがインフラエンジニアです。

私自身は主に検索機能のAPI周りの設計、アプリケーションの開発、大まかなインフラ設計・構築などを行っていました。

開発の技術スタック

GameWith としては新しい技術を使用した試みをいくつか行いました。

  • Dockerを使用してみた。
  • Laravel 5.6 を使用してみた。
  • PHP 7.2 を使用してみた。
  • Elasticsearch 6.2Sudachi のシステムフルディクショナリSudachiのユーザディクショナリ を使用してみた。
  • Amazon SQS を使用してみた。
  • PSR-2を厳守するため、 PHP_CodeSniffer を使用してみた。
  • 負荷テストのためGatlingを使用してみた。

パッと思いつくだけでも7個くらいの新しい挑戦をしました。GameWithとしてのプロダクションでは全てが初の試みなのでリリース大丈夫かなぁという漠然とした不安感があったのですが、いざリリースしてみると、動いてる!すごい!ってなりました(笑)

それぞれの技術スタックの選定ですが、弊社の本体のシステムは5年前から動いていることもあり、ところどころレガシーなのですが、 新しく創るものは、モダンにしたいよねということで選定していきました。ゼロベースだからこそできることですね (笑)

※ Laravelに至っては先日 5.7がリリースされて、 PHPは7.3がリリースされたので、近々アップグレードしていこうと思います。

PHPからElasticsearchとの通信はElasticの公式でSDKが配布されていますが、整形処理だとか、細かいことをしていきたい話になっていたため、GuzzleHttpを使って自前で用意しました。

ちなみに、この1.5ヶ月のコントリビューション数です。

f:id:m3m0r7:20180920134414p:plain

大まかな構成

大まかですが、現状は下図のような構成になっています。

f:id:m3m0r7:20180919182403p:plain

クライアントとの通信は Laravelが設置してある Application 側で行い、Application 側Elasticsearch Master Node と通信をして、受け取ったレスポンスを整形してクライアントへ返します。 設計図のRDSはGameWith本体サイトから記事情報を取得するために、本体のRDS利用しています。 またSQSは、攻略部の方が更新した記事・追加した記事の処理を積んでいくために用意しています。

ちなみに弊社では、Elastic-HQというElasticsearchの状況をブラウザで確認できるものがあるので利用しています。

f:id:m3m0r7:20180920134828j:plain

ページネーションでいうと、弊社の場合リアルタイムで記事が追加される場合があり、通常のナンバリングでのページネーションをすることができないため、 ElasticsearchのScroll機能を利用しています。

www.elastic.co

ちなみに、アプリケーションサーバー側から下記がレスポンスとして返ってきます。

f:id:m3m0r7:20180919183738j:plain

弊社の攻略記事は結構な数があるのですが、Elasticsearchを使用することにより瞬時に検索することができます。

リリース

テスト環境ではミニマムであったため、リリース前はプロダクション向けのインフラの構成などしていました。また実際にGameWith上の記事データ全てをElasticsearchに投入してみて、問題なく検索できるのかのチェックも行ったり。

また、実際にアクセス負荷に耐えられるのかを負荷テストを行ったところ、攻略記事が大量に追加されながらでも、アクセス数が多くても全然問題ないよねという結果となり、無事リリースしました 👏🎉 ご興味がある方はぜひアプリを触ってみてください ✌

play.google.com

改善点

今回の検索のスコア算定には時事の記事だとか、アクセス数が多いだとかの指標を入れていないので、検索精度向上のために入れていきたいなとやんわり考えてます。

また、キーワードのサジェストも出るといいよねという話があったりもするので、それをどう形にしていくかとか。

この検索機能はいずれGameWith本体でもリリースする予定ですので、お楽しみにしていてください 🎉 (あくまで予定です)

最後に

いかがでしたでしょうか。検索機能をもっとよくしたいなと考えています。私自身大学時代に自然言語処理(NLP)を主とした研究室にいたことがあるので、今回の実装は個人的に中々楽しかったなと思っています。 フロントエンドを触れていなかったので今は反動でフロントエンドがメインのタスクをやりつつ、検索機能の開発に携わっています(笑)

GameWithはサーバーサイドエンジニアとして一緒に働いていただける仲間を探しています!弊社のサイトの運営がやりたい!とか、NLPに興味があって検索機能の開発に携わってみたい方、ご興味があればぜひご連絡いただけると嬉しいです 👍 Wantedlyのリンクですが恥ずかしい方は、ツイッターで私に直接お声がけくださるのでも大丈夫です!

www.wantedly.com