O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Elasticsearch for Hackadoll

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
Carregando em…3
×

Confira estes a seguir

1 de 61 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a Elasticsearch for Hackadoll (20)

Anúncio

Mais de mosa siru (13)

Mais recentes (20)

Anúncio

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

×