Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
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
Prochain SlideShare
Chargement dans…5
×

Elasticsearch for Hackadoll

13 281 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

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

×