Raspberry Pi で作った Elasticsearch サーバにデータをポイポイと突っ込むこと数日。ある程度データも集まり、ストア間の項目も整理できてきたのでサムネイル一覧的なものが欲しいなぁと思い、http://ebook.stellarcat.net/ で作ってみた。(ドメインの契約が2月までなのでそのうち消えます) 2019-02-12 に新しいドメインを取得しました。
会社の人から「Vue.js 使ってみて」と言われたので Vue.js を使うことに。Vue.js でサーバ要らずなので EC2 は使わずに S3 と CloudFront だけでやることにした。
- Elasticsearch サーバはオフィスにあるので公開はしない。
- クローリングは一定間隔で行っており、リアルタイム性は無いので JSON は S3 に置いてしまおう。(API Gateway や Lambda の使用も考えたがランキングを表示する度に Elasticsearch に毎回アクセスする必要は無いのでやめた)
- Vue.js って何?
データソースは当初 Amazon、App Store、Google Play にしていたが、他の電子書籍サービスを見ているとランキングが単巻ではなくシリーズになっているのだと知った。で、そっちの方に専念してしまって Elasticsearch の設計なんかも変わってしまい、Amazon などは作り直しが追いついていない。
とりあえず以下のサービスに絞った。
下調べとしてサービスごとのランキングの変動タイミングの調査。eBookJapan と BookLive! は1日1回の更新らしい。(可視化には Kibana を使っていたが Grafana が ARM でも動くようだったので Grafana に変更した)
Elasticsearch のクエリは filter
や should
を使っていて色々面倒だったが、query_string
の使い方がわかったのでかなり楽になった。
Before
{ "query": { "bool": { "filter": [ { "term": { "store_id": "XXXXXX" } }, { "term": { "category_id": "XXXXXX" } }, { "range": { "@timestamp": { "gte": "now-1h" } } } ] } }, "sort": { "rank": { "order": "asc" } }, "from": 0, "size": 100 }
After
{ "query": { "query_string": { "query": "store_id:XXXXX AND category_id: XXXXX AND @timestamp:[now-1h TO now]" } }, "sort": { "rank": { "order": "asc" } }, "from": 0, "size": 100 }
Vue.js は「基礎から学ぶ Vue.js」さんのところを見ながら学習。
とりあえず Webpack を使うほどでもなかったので HTML と JavaScript をカキカキ…。最近は table も css で簡単にピボット出来たり便利だなぁ。
で、S3 に放り投げてドメインの設定して公開。
いまのところ Elasticsearch からの JSON をそのまま使っているのでこれも整形したいところ。著者名とかフィールドが配列になっているところの処理も考えなきゃいけない。Amazon とかのクローラーも作り直さなきゃ。
このランキングは継続して公開する予定はいまのところ無いです。一通り終わる頃にはドメインの契約が切れてる頃だと思うのでそこで終了する予定です。
そういえば本当はランキングじゃなくて無料配信中の書籍を集めるものを作りたかったんだけどそれはどこ行ったのか…。