SlideShare a Scribd company logo
Elasticsearch for Hackadoll
2015/08/31 @mosa_siru
1
自己紹介
2
@mosa_siru
• 「もさ」って呼んでください
• 「ボンバーマンの人」 って認
識いただければ大丈夫です
• もし興味があれば動画をご覧くださ
い http://www.nicovideo.jp/watch/
sm13612359
• 最近はSplatoonもやってます
3
@mosa_siru at DeNA
• 1年目: 新卒。プラットフォームでAPIとか運用
• 2年目: ハッカドール 立ち上げからジョイン
• サーバーサイドを担当
• 3年目: Web版ハッカドールを作ったり、メ
ジャーアップデートしたり
4
ハッカドール サーバーサイド
• なんかたくさん作った with @xaicron  , kommy
• API (100個)
• ニュース配信APIからゲームの賞品付与APIま
で、機能ありすぎて笑える
• Worker (70個)
• Crawler, Remote Notification, etc..
• 非同期処理やバッチ処理する君
5
ハッカドール サーバーサイド
• Web
• Web版でAngular実戦投入したけど良さげでした
• リコメンドシステム
• 分析基板部と連携
• OPE(管理ツール)
• ImageProxy(画像変換サーバー)
• Nginx Module, etc…
6
アジェンダ
7
アジェンダ
1. ハッカドールって?
2. Elasticsearch活用法
A. 検索
B. 関連記事
C. リコメンド
8
1. ハッカドールって?
9
ハッカドールって?
• アニメ・マンガ・ゲームなど、
オタク系の記事のみを扱った
ニュース配信アプリ
• おすすめ商品、イベントも届
けてくれる
• 使えば使うほど学習していく
10
ハッカドールって?
• ゲーミフィケーション
• というかゲームできる
• オタクユーザーに刺さる機能
が満載!
11
2014夏コミに合わせてリリース
12
• 高リターンレート
• 高ヘビーユーザー率
高いユーザー評価
13
Apple 2014 Best App!
14
2015 コミケ/アニサマ
15
アニメ化!
祝・アニメ化!
2. Elasticsearch活用法
17
ハッカドールでのES活用法
(A)検索
(B)関連記事
(C)キャリブレーション
18
A. 検索
19
ハッカドールでの検索機能
20
• 最新ニュース、新商品、イベント情報を検索できます
• というのはかんたんですが…
最高の検索のために
まずは検索に使うためにも、

記事にタグを付けたい
22
とりあえずmecabを用いて

記事を形態素解析
23
最高の辞書が必要
24
最高のオタク辞書を作る
• Wikipedia, ニコニコ大百科からオタク系キー
ワード一覧を取得
• 手動で最新キーワードを管理ツールから登録
• 詳細は去年つくったスライド「 るリコメ
ンドシステムの裏事情」をご覧ください
25
最高のシノニム
26
シノニムと正規化
• 表記揺れや同義語を吸収したい
• まず分かち書きされたものに対して各種正規化
• Unicode正規化 (NFC)
• 伸ばし棒 − ∼ ∼ ─ ━ ╌ ╍ ╴ ╶ ╸ ╺ ー - - – — ― − ー => ー
• 連続するものを1つに
• single quote ‘ ’ => '
• 全角英数字 A => A
• 英数字大文字 A => a
• 半角カタカナ アア => アア
27
シノニムと正規化
• 各種シノニムに変換
• 管理ツールで登録しておく
28
最高のフィルター
• あまりにも関係なさそうなタグはフィルタする (ブ
ラックリスト)
• 例:「こんにちは」「名無しさん」
• 正規表現でまとめて弾く
• 例:d+時d+分
• ブラックリストも管理ツール上で管理
29
ここまでのまとめ
• クローリングした記事をオタク辞書で分かち
書きし、正規化・シノニム変換を施し、フィ
ルタしたものをタグとする
• ようやくできたタグをESにPOST
30
ちなみに
• これらのマスターデータの運用は辛い
• A → Bへのシノニムが登録されたら、全てのタグAを
持つ記事のタグを再計算してESに再登録させる仕組み
• シノニムが削除された場合は?
• 辞書やシノニムをESに担当させることもできるが、辞書
やシノニム更新のたびにreindexingが必要だったり辛そ
うなのでやってない
31
検索クエリ
32
検索クエリ (ようやくESの話)
1. クエリ「まどマギ」で検索したとする
2. クエリをシノニム変換:「まどマギ」=> 「魔法少女まどか☆マギカ」
3. まずは完全一致でタグに当てる (terms query)
4. あるいは部分一致で全文に当てる (query_string query)
5. 最後に除外フィルタを通して最新順で返す
• 例:ベイジアンフィルタにより「えっちな記事」判定されたものを外す
• 例:各種ユーザーフィルタ(まとめサイトOFFなど)
• なお最新順で返す検索仕様は簡単(スコアリングを考えなくて良い)
33
検索クエリ
4. 「あるいは部分一致で全文に当てる」とは
• 目的:クエリ「魔法少女」でも「魔法少女まどか☆マギカ」に当たるよ
うにしたい
• analyzerのあるフィールドに

query_string query
• ただし一方「魔法少女」で

「少女」に当たらない

よう”” で囲んでいる

=> クエリは分かち書きされない
34
検索クエリ (ページング)
• やっぱりlimit offsetは使いたくない
• n+1件取得して、n+1件目の記事のtimestamp, idを
pageTokenとしてレスポンスに含める
• n+1件目は結果から除外する
• クライアントはページング時のリクエストに
pageTokenを入れる
• サーバーはpageToken以降の記事をn+1件取得する
(以下繰り返し)
35
検索補完
36
検索補完
• 補完により、入力補助はもちろん表記揺れリ
スクも解消できる
• 実装はまさかのMySQL!likeで前方一致!w
• あらかじめbatchで全キーワードの登場数を
管理するテーブルを作っている (TDIDFのDF)
• nginx proxy cacheでフロントキャッシュして
負荷軽減
• カジュアルに使えるのでおすすめ
37
検索補完
• 読みがな情報もいれておくことで、ひらがな
から漢字への補完も可能
• 読みがなはニコニコ大百科から取得したり、
管理ツールから入力
38
最高の検索になれたか?
まだまだできるはず
• 心地よく、違和感なく使えるレベルであるのは間違いない
• が、まだGoogleにはなれてない
• Fussy検索
• 「もしかして」
• And検索の補完
• “AND” “OR” “NOT” 文への対応
• シノニムやらもろもろと帳尻あわせつつ入れるの大変。やっぱり自然言
語まわりはむずかしい(こなみかん
40
おまけ:検索活用法
41
ウォッチリスト
42
• 好きなタイトル名などを登録しておくと、
そのキーワードを含んだニュースが出る
たびに教えてくれる(RSS like)
• オタクであるほど、好きな作品のニュー
スは逃したくない
• OR検索でElasticsearchから取得
• 検索を作りこんだおかげで可能となっ
た
B. 関連記事
43
関連記事
• その記事に関連する記事を教
えてくれる機能
44
ニュース記事 商品記事 イベント記事
ニュース記事 商品記事 イベント記事
関連記事
• 基本は先ほど紹介したタグ情報をもとに、ESのmlt (more
like this) クエリで近い記事を出しています
• mlt:「似た」ドキュメントを探してくれるイケメン機能
です
• 一致するタグを沢山もっている記事ほどスコアが高く
なる
• 全部”タグ”で完結するので、ニュース/商品/イベント記事
をまたいだマッチングが可能
45
関連記事(クエリ)
1. その記事のタグ情報を取得
2. mltスコアを計算
3. 新しい記事を重視するために、decayを掛け
あわせて最終スコアとする (function_score
query)
4. 除外フィルタを通し、スコアが高い順に表示
46
関連記事(クエリ)
2. mltスコアを計算
• 複数回登場するタグは、その回数分だけ

並べている
47
参考:mltのカスタマイズ箇所
name description default
percent_terms_to_match
このパーセント以上タグが

マッチしないと似ていると

みなされない
0.30
min_term_freq
最低この個数はタグがマッチしない
といけない
2
min_doc_req 全ドキュメント内でこの個数以上登
場するタグのみ用いる
5
ニュース、商品、イベント記事のタグの特性をもとに、

微妙に値をカスタマイズしている
関連記事(クエリ)
• 記事の最新度(decay)と掛
けあわせて最終スコアと
する
○日古くなると●倍のスコアとな
る曲線を指定できるが、パラメー
ター調整はわりと職人技(辛い)
49
設定例
C. キャリブレーション
50
キャリブレーション
初回起動時に、ユーザーの嗜好を取得して記事を表示
51
キャリブレーションの流れ
1. ユーザーの好きなカテゴリから、好きそ
うなキーワード群とそれぞれの重みを算
出
2. 一部をユーザーがオプトアウトし、最終
的な”taste”とする
3. tasteをESに投げ、初回記事を生成
4. 類似記事の排除をして記事確定

(詳細は略)
52
キャリブレーション(クエリ)
53
1. tasteをbool query化
• boost値はキーワード
ごとのスコア(重み)
• boost値が高いタグが
たくさんマッチする記
事はスコアが高い
キャリブレーション(クエリ)
54
2. 最新度, 記事のPV数など
で最終スコア調整
3. 各種フィルタを通し、ス
コアが高い順に返す
簡易リコメンドまで出来る僥倖…!
55
その他
56
その他活用箇所
• ユーザーアクティビティをESに入れて、
Kibanaで見たり人気記事を算出したり
• APIアクセスログのES化

(これはBigQueryにするかも)
57
まとめ
58
ES便利、だけど
• 検索、関連記事、ちょっとしたリコメンド
…いろいろできる!
• でも少し込み入ったことをするには沢山考
えることがあって辛い時もある
• やっぱりサービス作りは、ユーザーのた
めに泥臭く畑を耕すこと
59
その他ESへの雑感
• 速度面や安定性は流石の一言
• GCによるCPUがあれですが
• 機能が豊富すぎてびびる
• 細かいパラメーターチューニングができる分、凝りだすと逆に
辛い
• 公式ドキュメントのクエリ解説は正直わかりにくい
• レスポンスが書いてなかったりなど
• SQLに慣れすぎた人類には早かった
60
おわり
61
@mosa_siru

More Related Content

PDF
捗るリコメンドシステムの裏事情(ハッカドール)
PDF
クラシックな機械学習の入門  11.評価方法
PPTX
Group normalization
PDF
自作かな漢字変換「Genji」をつくったよ
PPTX
5分でわかるベイズ確率
PDF
REST API マスターへの道 - Office 365 パワーユーザー向け
PPTX
React-konvaで絵を描いてみる話
PPTX
強化学習 と ゲーム理論 (MARL)
捗るリコメンドシステムの裏事情(ハッカドール)
クラシックな機械学習の入門  11.評価方法
Group normalization
自作かな漢字変換「Genji」をつくったよ
5分でわかるベイズ確率
REST API マスターへの道 - Office 365 パワーユーザー向け
React-konvaで絵を描いてみる話
強化学習 と ゲーム理論 (MARL)

What's hot (20)

PDF
CTF for ビギナーズ バイナリ講習資料
PPTX
Sequence Level Training with Recurrent Neural Networks (関東CV勉強会 強化学習論文読み会)
PDF
深層意味表現学習 (Deep Semantic Representations)
PDF
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
PDF
20171128分散深層学習とChainerMNについて
PPTX
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
PDF
DeNA TechCon2018 ゲーム体験を支えるための強化学習
PDF
機械学習デザインパターン Machine Learning Design Patterns
PDF
Allocators@C++11
PDF
Rで実験計画法 前編
PDF
自然言語処理基礎の基礎
PPT
時系列データ分析
PPTX
金融情報における時系列分析
PDF
多数のグラフからの統計的機械学習 (2014.7.24 人工知能学会 第94回人工知能基本問題研究会 招待講演)
PPTX
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
PDF
DSIRNLP#1 ランキング学習ことはじめ
PDF
SSII2021 [TS3] 機械学習のアノテーションにおける データ収集​ 〜 精度向上のための仕組み・倫理や社会性バイアス 〜
PPTX
畳み込みLstm
PPTX
画像処理応用
PPTX
Rで学ぶ観察データでの因果推定
CTF for ビギナーズ バイナリ講習資料
Sequence Level Training with Recurrent Neural Networks (関東CV勉強会 強化学習論文読み会)
深層意味表現学習 (Deep Semantic Representations)
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
20171128分散深層学習とChainerMNについて
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
DeNA TechCon2018 ゲーム体験を支えるための強化学習
機械学習デザインパターン Machine Learning Design Patterns
Allocators@C++11
Rで実験計画法 前編
自然言語処理基礎の基礎
時系列データ分析
金融情報における時系列分析
多数のグラフからの統計的機械学習 (2014.7.24 人工知能学会 第94回人工知能基本問題研究会 招待講演)
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
DSIRNLP#1 ランキング学習ことはじめ
SSII2021 [TS3] 機械学習のアノテーションにおける データ収集​ 〜 精度向上のための仕組み・倫理や社会性バイアス 〜
畳み込みLstm
画像処理応用
Rで学ぶ観察データでの因果推定

More from mosa siru (12)

PDF
LayerXのQAチームで目指したい動き方 (社内資料)
PDF
開発速度が速い #とは(LayerX社内資料)
PDF
KYC and identity on blockchain
PPTX
マイニングプールの収益配分と攻撃手法
PDF
Payment Channel Introduction
PDF
Go, memcached, microservices
PDF
ニュースパスのクローラーアーキテクチャとマイクロサービス
PDF
マイクロにしすぎた結果がこれだよ!
PDF
lua_nginx_module JSON-RPC 2.0 Batch Request
PDF
Twitter SmartList (第5回若手webエンジニア交流会)
PDF
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
PDF
how to make twitter list automatically
LayerXのQAチームで目指したい動き方 (社内資料)
開発速度が速い #とは(LayerX社内資料)
KYC and identity on blockchain
マイニングプールの収益配分と攻撃手法
Payment Channel Introduction
Go, memcached, microservices
ニュースパスのクローラーアーキテクチャとマイクロサービス
マイクロにしすぎた結果がこれだよ!
lua_nginx_module JSON-RPC 2.0 Batch Request
Twitter SmartList (第5回若手webエンジニア交流会)
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
how to make twitter list automatically

Elasticsearch for Hackadoll