Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Elasticsearch for Hackadoll
2015/08/31 @mosa_siru
1
自己紹介
2
@mosa_siru
• 「もさ」って呼んでください
• 「ボンバーマンの人」 って認
識いただければ大丈夫です
• もし興味があれば動画をご覧くださ
い http://www.nicovideo.jp/watch/
sm13612359
• ...
@mosa_siru at DeNA
• 1年目: 新卒。プラットフォームでAPIとか運用
• 2年目: ハッカドール 立ち上げからジョイン
• サーバーサイドを担当
• 3年目: Web版ハッカドールを作ったり、メ
ジャーアップデートしたり
4
ハッカドール サーバーサイド
• なんかたくさん作った with @xaicron  , kommy
• API (100個)
• ニュース配信APIからゲームの賞品付与APIま
で、機能ありすぎて笑える
• Worker (70個)
• Cr...
ハッカドール サーバーサイド
• Web
• Web版でAngular実戦投入したけど良さげでした
• リコメンドシステム
• 分析基板部と連携
• OPE(管理ツール)
• ImageProxy(画像変換サーバー)
• Nginx Modul...
アジェンダ
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)
• 伸ばし棒 − ∼ ∼ ─ ━ ╌ ╍ ╴ ╶ ╸ ╺ ー - - – — ― − ー => ー
• 連...
シノニムと正規化
• 各種シノニムに変換
• 管理ツールで登録しておく
28
最高のフィルター
• あまりにも関係なさそうなタグはフィルタする (ブ
ラックリスト)
• 例:「こんにちは」「名無しさん」
• 正規表現でまとめて弾く
• 例:d+時d+分
• ブラックリストも管理ツール上で管理
29
ここまでのまとめ
• クローリングした記事をオタク辞書で分かち
書きし、正規化・シノニム変換を施し、フィ
ルタしたものをタグとする
• ようやくできたタグをESにPOST
30
ちなみに
• これらのマスターデータの運用は辛い
• A → Bへのシノニムが登録されたら、全てのタグAを
持つ記事のタグを再計算してESに再登録させる仕組み
• シノニムが削除された場合は?
• 辞書やシノニムをESに担当させることもできるが...
検索クエリ
32
検索クエリ (ようやくESの話)
1. クエリ「まどマギ」で検索したとする
2. クエリをシノニム変換:「まどマギ」=> 「魔法少女まどか☆マギカ」
3. まずは完全一致でタグに当てる (terms query)
4. あるいは部分一致で全文に...
検索クエリ
4. 「あるいは部分一致で全文に当てる」とは
• 目的:クエリ「魔法少女」でも「魔法少女まどか☆マギカ」に当たるよ
うにしたい
• analyzerのあるフィールドに

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

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

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

みなされない
0.30
min_term_freq
最低この...
関連記事(クエリ)
• 記事の最新度(decay)と掛
けあわせて最終スコアと
する
○日古くなると●倍のスコアとな
る曲線を指定できるが、パラメー
ター調整はわりと職人技(辛い)
49
設定例
C. キャリブレーション
50
キャリブレーション
初回起動時に、ユーザーの嗜好を取得して記事を表示
51
キャリブレーションの流れ
1. ユーザーの好きなカテゴリから、好きそ
うなキーワード群とそれぞれの重みを算
出
2. 一部をユーザーがオプトアウトし、最終
的な”taste”とする
3. tasteをESに投げ、初回記事を生成
4. 類似記事の...
キャリブレーション(クエリ)
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があれですが
• 機能が豊富すぎてびびる
• 細かいパラメーターチューニングができる分、凝りだすと逆に
辛い
• 公式ドキュメントのクエリ解説は正直わかりにくい
• レスポ...
おわり
61
@mosa_siru
Upcoming SlideShare
Loading in …5
×

Elasticsearch for Hackadoll

12,544 views

Published on

ハッカドールにおけるElasitcsearch活用法。
DeNA社内向けに発表したものです。

Published in: Technology
  • Be the first to comment

Elasticsearch for Hackadoll

  1. 1. Elasticsearch for Hackadoll 2015/08/31 @mosa_siru 1
  2. 2. 自己紹介 2
  3. 3. @mosa_siru • 「もさ」って呼んでください • 「ボンバーマンの人」 って認 識いただければ大丈夫です • もし興味があれば動画をご覧くださ い http://www.nicovideo.jp/watch/ sm13612359 • 最近はSplatoonもやってます 3
  4. 4. @mosa_siru at DeNA • 1年目: 新卒。プラットフォームでAPIとか運用 • 2年目: ハッカドール 立ち上げからジョイン • サーバーサイドを担当 • 3年目: Web版ハッカドールを作ったり、メ ジャーアップデートしたり 4
  5. 5. ハッカドール サーバーサイド • なんかたくさん作った with @xaicron  , kommy • API (100個) • ニュース配信APIからゲームの賞品付与APIま で、機能ありすぎて笑える • Worker (70個) • Crawler, Remote Notification, etc.. • 非同期処理やバッチ処理する君 5
  6. 6. ハッカドール サーバーサイド • Web • Web版でAngular実戦投入したけど良さげでした • リコメンドシステム • 分析基板部と連携 • OPE(管理ツール) • ImageProxy(画像変換サーバー) • Nginx Module, etc… 6
  7. 7. アジェンダ 7
  8. 8. アジェンダ 1. ハッカドールって? 2. Elasticsearch活用法 A. 検索 B. 関連記事 C. リコメンド 8
  9. 9. 1. ハッカドールって? 9
  10. 10. ハッカドールって? • アニメ・マンガ・ゲームなど、 オタク系の記事のみを扱った ニュース配信アプリ • おすすめ商品、イベントも届 けてくれる • 使えば使うほど学習していく 10
  11. 11. ハッカドールって? • ゲーミフィケーション • というかゲームできる • オタクユーザーに刺さる機能 が満載! 11
  12. 12. 2014夏コミに合わせてリリース 12
  13. 13. • 高リターンレート • 高ヘビーユーザー率 高いユーザー評価 13
  14. 14. Apple 2014 Best App! 14
  15. 15. 2015 コミケ/アニサマ 15
  16. 16. アニメ化! 祝・アニメ化!
  17. 17. 2. Elasticsearch活用法 17
  18. 18. ハッカドールでのES活用法 (A)検索 (B)関連記事 (C)キャリブレーション 18
  19. 19. A. 検索 19
  20. 20. ハッカドールでの検索機能 20 • 最新ニュース、新商品、イベント情報を検索できます • というのはかんたんですが…
  21. 21. 最高の検索のために
  22. 22. まずは検索に使うためにも、
 記事にタグを付けたい 22
  23. 23. とりあえずmecabを用いて
 記事を形態素解析 23
  24. 24. 最高の辞書が必要 24
  25. 25. 最高のオタク辞書を作る • Wikipedia, ニコニコ大百科からオタク系キー ワード一覧を取得 • 手動で最新キーワードを管理ツールから登録 • 詳細は去年つくったスライド「 るリコメ ンドシステムの裏事情」をご覧ください 25
  26. 26. 最高のシノニム 26
  27. 27. シノニムと正規化 • 表記揺れや同義語を吸収したい • まず分かち書きされたものに対して各種正規化 • Unicode正規化 (NFC) • 伸ばし棒 − ∼ ∼ ─ ━ ╌ ╍ ╴ ╶ ╸ ╺ ー - - – — ― − ー => ー • 連続するものを1つに • single quote ‘ ’ => ' • 全角英数字 A => A • 英数字大文字 A => a • 半角カタカナ アア => アア 27
  28. 28. シノニムと正規化 • 各種シノニムに変換 • 管理ツールで登録しておく 28
  29. 29. 最高のフィルター • あまりにも関係なさそうなタグはフィルタする (ブ ラックリスト) • 例:「こんにちは」「名無しさん」 • 正規表現でまとめて弾く • 例:d+時d+分 • ブラックリストも管理ツール上で管理 29
  30. 30. ここまでのまとめ • クローリングした記事をオタク辞書で分かち 書きし、正規化・シノニム変換を施し、フィ ルタしたものをタグとする • ようやくできたタグをESにPOST 30
  31. 31. ちなみに • これらのマスターデータの運用は辛い • A → Bへのシノニムが登録されたら、全てのタグAを 持つ記事のタグを再計算してESに再登録させる仕組み • シノニムが削除された場合は? • 辞書やシノニムをESに担当させることもできるが、辞書 やシノニム更新のたびにreindexingが必要だったり辛そ うなのでやってない 31
  32. 32. 検索クエリ 32
  33. 33. 検索クエリ (ようやくESの話) 1. クエリ「まどマギ」で検索したとする 2. クエリをシノニム変換:「まどマギ」=> 「魔法少女まどか☆マギカ」 3. まずは完全一致でタグに当てる (terms query) 4. あるいは部分一致で全文に当てる (query_string query) 5. 最後に除外フィルタを通して最新順で返す • 例:ベイジアンフィルタにより「えっちな記事」判定されたものを外す • 例:各種ユーザーフィルタ(まとめサイトOFFなど) • なお最新順で返す検索仕様は簡単(スコアリングを考えなくて良い) 33
  34. 34. 検索クエリ 4. 「あるいは部分一致で全文に当てる」とは • 目的:クエリ「魔法少女」でも「魔法少女まどか☆マギカ」に当たるよ うにしたい • analyzerのあるフィールドに
 query_string query • ただし一方「魔法少女」で
 「少女」に当たらない
 よう”” で囲んでいる
 => クエリは分かち書きされない 34
  35. 35. 検索クエリ (ページング) • やっぱりlimit offsetは使いたくない • n+1件取得して、n+1件目の記事のtimestamp, idを pageTokenとしてレスポンスに含める • n+1件目は結果から除外する • クライアントはページング時のリクエストに pageTokenを入れる • サーバーはpageToken以降の記事をn+1件取得する (以下繰り返し) 35
  36. 36. 検索補完 36
  37. 37. 検索補完 • 補完により、入力補助はもちろん表記揺れリ スクも解消できる • 実装はまさかのMySQL!likeで前方一致!w • あらかじめbatchで全キーワードの登場数を 管理するテーブルを作っている (TDIDFのDF) • nginx proxy cacheでフロントキャッシュして 負荷軽減 • カジュアルに使えるのでおすすめ 37
  38. 38. 検索補完 • 読みがな情報もいれておくことで、ひらがな から漢字への補完も可能 • 読みがなはニコニコ大百科から取得したり、 管理ツールから入力 38
  39. 39. 最高の検索になれたか?
  40. 40. まだまだできるはず • 心地よく、違和感なく使えるレベルであるのは間違いない • が、まだGoogleにはなれてない • Fussy検索 • 「もしかして」 • And検索の補完 • “AND” “OR” “NOT” 文への対応 • シノニムやらもろもろと帳尻あわせつつ入れるの大変。やっぱり自然言 語まわりはむずかしい(こなみかん 40
  41. 41. おまけ:検索活用法 41
  42. 42. ウォッチリスト 42 • 好きなタイトル名などを登録しておくと、 そのキーワードを含んだニュースが出る たびに教えてくれる(RSS like) • オタクであるほど、好きな作品のニュー スは逃したくない • OR検索でElasticsearchから取得 • 検索を作りこんだおかげで可能となっ た
  43. 43. B. 関連記事 43
  44. 44. 関連記事 • その記事に関連する記事を教 えてくれる機能 44 ニュース記事 商品記事 イベント記事 ニュース記事 商品記事 イベント記事
  45. 45. 関連記事 • 基本は先ほど紹介したタグ情報をもとに、ESのmlt (more like this) クエリで近い記事を出しています • mlt:「似た」ドキュメントを探してくれるイケメン機能 です • 一致するタグを沢山もっている記事ほどスコアが高く なる • 全部”タグ”で完結するので、ニュース/商品/イベント記事 をまたいだマッチングが可能 45
  46. 46. 関連記事(クエリ) 1. その記事のタグ情報を取得 2. mltスコアを計算 3. 新しい記事を重視するために、decayを掛け あわせて最終スコアとする (function_score query) 4. 除外フィルタを通し、スコアが高い順に表示 46
  47. 47. 関連記事(クエリ) 2. mltスコアを計算 • 複数回登場するタグは、その回数分だけ
 並べている 47
  48. 48. 参考:mltのカスタマイズ箇所 name description default percent_terms_to_match このパーセント以上タグが
 マッチしないと似ていると
 みなされない 0.30 min_term_freq 最低この個数はタグがマッチしない といけない 2 min_doc_req 全ドキュメント内でこの個数以上登 場するタグのみ用いる 5 ニュース、商品、イベント記事のタグの特性をもとに、
 微妙に値をカスタマイズしている
  49. 49. 関連記事(クエリ) • 記事の最新度(decay)と掛 けあわせて最終スコアと する ○日古くなると●倍のスコアとな る曲線を指定できるが、パラメー ター調整はわりと職人技(辛い) 49 設定例
  50. 50. C. キャリブレーション 50
  51. 51. キャリブレーション 初回起動時に、ユーザーの嗜好を取得して記事を表示 51
  52. 52. キャリブレーションの流れ 1. ユーザーの好きなカテゴリから、好きそ うなキーワード群とそれぞれの重みを算 出 2. 一部をユーザーがオプトアウトし、最終 的な”taste”とする 3. tasteをESに投げ、初回記事を生成 4. 類似記事の排除をして記事確定
 (詳細は略) 52
  53. 53. キャリブレーション(クエリ) 53 1. tasteをbool query化 • boost値はキーワード ごとのスコア(重み) • boost値が高いタグが たくさんマッチする記 事はスコアが高い
  54. 54. キャリブレーション(クエリ) 54 2. 最新度, 記事のPV数など で最終スコア調整 3. 各種フィルタを通し、ス コアが高い順に返す
  55. 55. 簡易リコメンドまで出来る僥倖…! 55
  56. 56. その他 56
  57. 57. その他活用箇所 • ユーザーアクティビティをESに入れて、 Kibanaで見たり人気記事を算出したり • APIアクセスログのES化
 (これはBigQueryにするかも) 57
  58. 58. まとめ 58
  59. 59. ES便利、だけど • 検索、関連記事、ちょっとしたリコメンド …いろいろできる! • でも少し込み入ったことをするには沢山考 えることがあって辛い時もある • やっぱりサービス作りは、ユーザーのた めに泥臭く畑を耕すこと 59
  60. 60. その他ESへの雑感 • 速度面や安定性は流石の一言 • GCによるCPUがあれですが • 機能が豊富すぎてびびる • 細かいパラメーターチューニングができる分、凝りだすと逆に 辛い • 公式ドキュメントのクエリ解説は正直わかりにくい • レスポンスが書いてなかったりなど • SQLに慣れすぎた人類には早かった 60
  61. 61. おわり 61 @mosa_siru

×