供養というわけでメモ.
GoToEats京都
この企画自体についてはみんな知ってると思います.
公式サイトが使いづらい
京都の店舗検索サイトが登場したときはきわめて使いづらいものでした.フリーワード検索機能が存在せず,カテゴリによる絞り込みこそあれど,延々と600ページあるリストをスクロールするというなかなかハードコアな仕様だったのです.
そこで,これをスクレイピングしてJSONに落とし,Kuromojiに対応させたElasticSearchクラスタにインデキシングしつつ,Google Map APIを使って住所から座標を取得し,地図上に表示するシステムの開発を行いました.
結論から言うと,検索は可能になりましたが,地図に表示する実装が間に合わずに公式サイトに先を越されて検索を実装されてしまったので敗北してしまいました.
政府の勝ち! なんで負けたか、明日まで考えといてください。
— moznion (@moznion) 2020年10月23日
アーキテクチャ
基本的なデータは手元で作成し,S3に投入すると自動的にLambdaがES Serviceに投入してくれるようなアーキテクチャとしました.もっとPython力があればパーサとかもLambdaに移すことができたのですが,慣れているPerlやtidyコマンドを使ったのでそのへんはローカルになりました.
自分たちだけで使えればよいと考えていたので,検索画面は素朴にKibanaにしました.アクセス管理はCognitoに任せています.
公式ページから得られる情報だけだと検索する情報が足りないので,公式サイトに記載されているURIにアクセスし,meta descriptionを取得してきていっしょにインデキシングすることでヒットさせやすくする,といったテクニックを使いました.
画面
あまり残ってませんでした.
GoToEats京都対応店を検索するためだけに作られた検索エンジン開発した pic.twitter.com/doW7ZpGnI6
— W i n d y m e l t (@windymelt) 2020年10月11日
良かったこと
- AWS ES Serviceの使い方がわかった.Congnitoとの連携方法がつかめた.
- Lambdaと他のAWSサービスとを連携させる経験が増えた.
- AWS ES ServiceにはKuromojiが標準で入っているのでいきなり日本語検索できる
- Cognito便利ですね,といいつつ自分は素朴なアクセス管理さえできればいいんだけど・・・
- 久々に動くものを1から作れる体験ができた
大変だったこと
- S3アップロードに時間がかかった
- 店舗ごとにJSONが分かれていて1つずつアップする仕様だったので時間がかかった
- 迷惑にならないように手元にデータをキャッシュしてはいたものの,めちゃくちゃ遅いページとかがあったのでフェッチにも時間がかかった
- KibanaからESクラスタにリクエストを投げることはできたものの,インデックスの作成やアナライザの設定はほぼ素人だったのでうまく動作させるまでが大変でストレスフルだった
- 動かしながらやると大変なので,jsonファイルを手元で作って吟味するといったことをやった
- ES Serviceは高い!!!(小さいインスタンス使ったけど月3000円くらいかかる)
- XPathベースのパースが大変だった
- パターンマッチベースでなんかいい感じにならないものか
- 穴開きXMLみたいなのを書くと変数にマッチしてくれる,みたいな(既にある??)
次やれるとよいこと
- 手際の良いESインデックス作成ができると良いですね.
- スクリプトにしてサクっと立てられるようにしたり,CIにしたりできそう
- バッチで情報投入できるはずなので,100件ずつとかまとめて処理できると良さそう
- PerlだけだとAWS世界観に乗れないことがあるのでPythonかRubyかをピャッと書けるようになっておきたい
- tidy(HTMLのサニタイズ)だけをやってくれる便利なLambdaみたいなのを用意しておいて,出入口をS3とかSQSとかにしておくと便利そう
- マイクロサービスみがある
リポジトリ
あまり整理されてないけどリポジトリを公開します.
感想
アクセス管理が一番面倒で,昔は雑に公開してれば良かったけど,現代において雑に公開するとあっという間に変なクエリを撃たれたり,破産しそうになったり,悪いことに使われたりしてしまうので,労力の半分くらいが「安全な環境」に費されている気がする.