開発合宿報告〜Elasticsearch編〜

Misoca開発チームの黒曜です。 10月からMisoca開発に参加させていただいています。 好きな言語はOCaml、最近興味のあるトピックは幽霊型です。 Ruby歴は半年くらいの初心者なので、いろいろ調べつつ教えてもらいつつ、新しいお仕事をしています。

さて、世間はクリスマスとRuby2.3.0で沸き立っていますが、そんなことは全く関係なく、開発合宿の報告をしたいと思います。

Misoca開発チームでは11月5日〜7日に、伊東温泉にある山喜旅館さんへ開発合宿に行ってきました。 今回の開発合宿では「日頃気になっているけど手を付けられていない課題を解決する」ことを目標に、2チームに分かれて開発を行いました。 この記事では、「検索機能をより良くする」ことを目的にしたElasticsearchチーム(黒曜, taiki-t)のレポートをまとめます。 絵文字チームのレポートは前回の記事をご覧ください。

チームの目標

Misocaでは検索を素朴な方法で行っていたのですが、データ量に対してスケールしない、柔軟な検索が難しい、といった課題がありました。 現状では大きな問題はないのですが、今後のことも考えて独立した検索エンジンに乗り換えたい、ということでElasticsearchへの移行を行うのがチームの目標です。 Elasticsearchはオープンソース検索エンジンで、スケールさせやすく、REST経由で操作ができるためWebシステムに組み込みやすい、などといった特徴があります。 使い方などについて、詳しくはWantedlyさんの記事がオススメです。

ミニマムに進めるため、開発合宿での作業対象は「品番・品名を入力した時に出てくるプルダウンボックス」に絞ることにしました。 以下のスクリーンショットの部分ですね。

f:id:kokuyouwind:20151217151036p:plain

1日目

名古屋を出発して、富士川楽座を経由しつつ沼津に寄り道します。 「深海魚が食べたい」というmzpさんのリクエストにより、深海魚を握ってくれる活けいけ丸さんで昼食。

f:id:kokuyouwind:20151217151257j:plain

ニギスや生しらす・生桜えびなど、普段食べられない珍しいものが食べられました。 個人的には「しらす入り米アイス」が普通に美味しくて面白かったです。

f:id:kokuyouwind:20151217151336j:plain

その後はすぐ近くにある深海水族館で、先ほど食べた魚が生前どんな姿だったのかを堪能します。 深海の光というブースが独特の雰囲気で素晴らしかったのと、ダイオウグソクムシさんにお会いすることができたので、大変満足感がありました。

以前、自分がスタッフ参加したイベントにダイオウグソクムシさんが来ていたのですが、長蛇の列ができており休憩時間では見ることができなかったんですよね… 個人的な話ですが、リベンジを果たすことができました。

f:id:kokuyouwind:20151217151407j:plain

さて、沼津を発って、夕方ごろに山喜旅館さんに到着しました。 夕方からは会議室を借りてのブリーフィングです。 ここまでが観光旅行記みたいになっていますが、ようやく開発合宿らしさが出てきましたね。

f:id:kokuyouwind:20151217170024j:plain

タスクを洗い出して、「AWS Elasticsearch Service周りの調査と設定」を自分が、「RailsからElasticsearchへの接続周り」をtaiki-tさんが、という形でざっくり分担します。 この時点でElasticsearchの知識があまりなかったため、とりあえず基本的な仕組みを調べているだけで夕食の時間になってしまいました。

f:id:kokuyouwind:20151217151724j:plain

写真のものの他に、ご飯・汁物・茶碗蒸し・天ぷらなどが後から出てきました。 山喜旅館さんのご飯は非常に美味しく、ボリュームもあって素晴らしかったです。

食後に温泉に入ってから下調べの続きをしていたのですが、睡魔に抗えず早々に眠ってしまいました… 明日、明日は頑張る…

2日目

この日は午前中に伊東湯の花通り商店街を散策しました。 老舗の椿油専門店など興味を惹かれるお店が多い中、お湯かけ七福神のスタンプラリーをtaiki-tさんが喜々としてコンプしていたのが印象的でした。

午後からは、近くにある東海館を見学しました。 テルマエ・ロマエに出てくる東林館のモデルにもなっているらしく、歴史を感じる建物でした。

f:id:kokuyouwind:20151224140703j:plain

ただ、歴史を感じる建物の中に突如として現れる、現代的画風の源頼朝さん御一家がすごいインパクトでした。 確か音無神社に関する展示だったと思います。 八重姫がやたらと可愛らしいです。

f:id:kokuyouwind:20151217151837j:plain

さて、東海館見学の後は、併設の喫茶室でコーヒーを飲みつつ作業の続きをしていました。 この時点でREST API経由での実験を重ねて、Mappingの設定をある程度固めることができました。 歴史ある建物で川のせせらぎを聞きつつ作業するのは非常に気持ちよかったので、東海館に行かれることがあればぜひお試しください。

f:id:kokuyouwind:20151217152014j:plain

夜にはtaiki-tさんの作ったRails側とのつなぎ込みを行い、品目検索がElasticsearch上で動くようになりました。 ただ、この時点ではMapping設定がbigramのみだったため1文字で検索ができなかったり、入力と先頭一致したものが最初に出てこないなど、いくつか不満な点がありました。

23時を超えた辺りでほかの人が寝静まり部屋での作業がしづらい感じになったのですが、上記の不満点が気になったため、一人でロビーに行きMappingの設定調整を行いました。 謎の能面が展示されていたため、能面に見守られ(あるいは睨まれ)ながらプログラミングをするという、大変シュールな絵面だったと思います。 検索が1文字の場合のみmatch検索からterm検索に切替える、検索クエリをbigramと先頭一致とのboolにする、などの対応が2時頃に完了し、無事上記の課題が解決したため、部屋に帰って寝ました。

3日目

最終日は成果報告会をして、山喜旅館さんを後にしました。 とりあえず動くものを見せられて一安心です。 山喜旅館さん、ありがとうございました!

f:id:kokuyouwind:20151217151932j:plain

その後

さて、Elasticsearchを使った検索は、調整を経て先日リリースされました。 その際に、漢字を読みがなでも検索できるなど、機能が一部強化されています。

先頭一致を優先して表示したり、

f:id:kokuyouwind:20151217151143p:plain

うろ覚えでも検索できたり、

f:id:kokuyouwind:20151217151212p:plain

漢字で入力したものがひらがなで検索できたり、

f:id:kokuyouwind:20151217151235p:plain

と、部分一致のみだった以前よりだいぶ賢くなっています。 応答速度も、以前に比べてキビキビと表示されるようになりました。

まとめ

入社2週間ちょいでいきなり連れて行かれた開発合宿でしたが、楽しく開発することができました。 開発合宿というもの自体も初めてだったのですが、ついつい周辺の観光をしたり温泉でのんびりしたりで時間を使ったので、開発合宿では鉄の意志で作業を進めるか、余裕を持って2〜3泊くらいのスケジュールにするのが良さそうでした。

それでは皆さん、メリークリスマス & 良いお年を。