Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elasticsearchで作るメディアサイト

 Elasticsearchで作るメディアサイト

体験メディアサイトYOKKA (よっか) のES活用例紹介
第41回Elasticsearch勉強会
2021.04.22 #elasticsearchjp

Kunihiko Kido

April 22, 2021
Tweet

More Decks by Kunihiko Kido

Other Decks in Technology

Transcript

  1. Elasticsearchで作る
    メディアサイト
    体験メディアサイトYOKKA (よっか) のES活用例紹介
    第41回Elasticsearch勉強会
    2021.04.22 #elasticsearchjp
    Kunihiko Kido
    @9215

    View full-size slide

  2. ● 木戸国彦(キド クニヒコ)
    ○ ベルトラ株式会社 / Product & Technology Div / PDM & UX Dept Manager
    ● これまでの検索エンジンとの関わり
    ○ 2004 FAST Enterprise Search Platform (FAST ESP) の日本国内企業へ導入支援 [System]
    ○ 2007 Saas型のサイト内検索サービス事業立ち上げ
    [System]
    ○ 2007 〜 2015 不動産、家電量販店など大手
    ECポータル向けに商品検索企画・開発
    [UI/UX]
    ○ 2011 サイト内検索サービスをクラウドへ移行
    [System]
    ○ 2014 クラウド型のサイト内検索サービスを
    Elasticsearchへ [System]
    ○ 2014 Hello! Elasticsearch ブログ公開開始 [Blog]
    ○ 2015 自然言語研究者向けに
    SNSの分析基盤企画・開発 [System]
    ○ 2016 オムニチャネル向け
    ECプラットフォームのサーチアドバイザー
    [System]
    ○ 2017 [ベルトラ]カスタマーサポートの生産性向上(
    Elastic{On} で登壇) [Productivity/Analytics]
    ○ 2018 [ベルトラ] サポートサイトを
    Elasticsearchベースでリニューアルし問合せ率削減に貢献
    [UI/UX]
    ○ 2019 〜 2020 [ベルトラ] 情報利活用におけるサービス企画開発
    [UI/UX/Analytics]
    ○ 2021 [ベルトラ] メディア新規事業企画・開発 [UI/UX]
    自己紹介
    @9215

    View full-size slide

  3. もくじ
    ● はじめに
    ● なぜ Elasticsearch を使うのか?
    ● YOKKA (よっか) の Elasticsearch 活用例
    ● メリット・デメリット
    ● こんな使い方も(YOKKAではないですが)
    ● さいごに(お知らせ)

    View full-size slide

  4. はじめに

    View full-size slide

  5. ベルトラについて
    日本国内および世界 150ヵ国の観光ツアー、文化体験、グルメツアー、ショ ー・エンターテインメントチケット、アク
    ティビティ、クルーズ、スパ・エステ等を旅先で体験する、現地体験型オプショナルツアー専門のオンライン予約サイ
    ト「VELTRA.com」を運営しています。
    12,000+
    Activities Worldwide
    4,000+
    Partners
    150
    Countries
    430,000
    Customer Reviews
    2 million +
    Members Worldwide
    2021年4月現在

    View full-size slide

  6. 新たな体験や
    趣味探しのアイデアを提案する
    体験発信メディアサイト
    YOKKA “よっか”
    2021年3月24日リリース
    新しい自分に出会うため、
    さあ、次の休日に「やってみよっか」
    https://www.veltra.com/jp/yokka/

    View full-size slide

  7. なぜ Elasticsearch を使うのか?

    View full-size slide

  8. Elasticsearch を使う理由はこの3つ
    1. データ管理をシンプルに保ちたい
    2. UXのビジネス要件を柔軟に実現したい
    3. 曖昧なビジネスニーズに対応、チューニングできるようにしたい

    View full-size slide

  9. サイトナビゲーションのための階層構造はデータ
    管理には不要なためシンプルに保てる
    階層構造を管理する管理者が不要、データ移行や再利用もしやすいメリットがある
    データ管理をシンプルに保ちたい
    記事
    スラッグ
    コンテンツ

    スラッグ
    名前
    地域
    スラッグ
    名前






    記事
    スラッグ
    コンテンツ

    スラッグ
    名前
    地域
    スラッグ
    名前

    * *

    ビジネス要件RDB、データ管理RDB
    のデータ管理設計例
    ビジネス要件Elasticsearch、データ管理RDB
    のデータ管理設計例
    サイトナビゲーションのための階層構造など複
    雑になっていく
    ◀国にしか関連づけない
    データも

    View full-size slide

  10. UXのビジネス要件を柔軟に実現したい
    記事
    スラッグ
    コンテンツ

    スラッグ
    名前
    地域
    スラッグ
    名前

    * *

    著者
    名前


    ツリー ファセット
    ハイパーリンク ウィザード
    {Elasticsearch}
    シンプルなデータ構造
    Elasticsearch を使うと Aggregations を使ってデータ構造を
    買えずに様々なナビゲーションを実現できる

    View full-size slide

  11. Elasticsearch のスコアリングを使って
    柔軟に掲載順いをコントロール
    曖昧なビジネスニーズに対応、チューニングできるようにしたい
    サイト利用者のニーズ
    ● 同じような内容なら新しい情報を知りたい
    ● 他の人がよく調べる情報は自分も知りたい
    ● 趣味思考にあった情報をおすすめしてほしい
    サイト運営者のニーズ
    ● タイアップ記事(PR)を読んでもらいたい
    「いい感じにしてね^^;」
    <曖昧なビジネスニーズ> <Elasticsearchのスコアリング>
    鮮度
    公開日付を基準にスコアリング
    人気
    いいね数のスコアリング
    プロモーション
    プロモーションかどうかのスコアリング
    Weight
    60
    %
    Weight
    25
    %
    Weight
    10
    %
    Weight
    40
    %
    Weight
    50
    %
    Weight
    10
    %
    Weight
    30
    %
    Weight
    50
    %
    Weight
    10
    %
    趣味思考
    趣味思考を表すキーワードがマッチするかどうかスコアリン

    Weight
    5
    %
    Weight
    0
    %
    Weight
    10
    %

    View full-size slide

  12. YOKKA (よっか) の
    Elasticsearch 活用例

    View full-size slide

  13. 設計方針
    あまり人の手を使った運用をせずに、記事の投稿状況やサイトでのユーザーアクション
    (いいね、など)によって、各種ページの掲載順位やナビゲーションをダイナミックに最適
    化。将来的にはユーザーの趣味嗜好に合わせてサイト全体をパーソナライズできるよう
    にする。

    View full-size slide

  14. 検索エンジンの適用範囲
    Keyword
    Search result pages
    検索エンジンと言うと検索結果
    ページを思い浮かべるが、、
    Keyword
    Search result pages TOP/Category pages Navigations
    Going out
    Hobby
    Travel
    サイト内のコンテンツ一覧、各種ナビゲーションは Elasticsearchを使って
    ます。※現在は記事がメインの情報のみ

    View full-size slide

  15. ❶ おすすめ順で記事を掲載

    View full-size slide

  16. おすすめ順=Function score query でスコアを調整
    {
    "functions": [
    {
    "filter": {
    "term": {"is_promotion": true}
    },
    "weight": 0.1
    },
    {
    "field_value_factor": {
    "field": "likes", "factor": 1, "modifier": "log1p"
    },
    "weight": 0.3
    },
    {
    "exp": {
    "pub_date": {
    "origin": "now", "scale": "10d", "offset": "3d", "decay": 0.8
    }
    },
    "weight": 0.6
    }
    ],
    "score_mode": "sum",
    "boost_mode": "replace"
    }
    プロモーションかどうか
    のスコアリング
    いいね数の
    スコアリング
    記事の公開日時
    のスコアリング

    View full-size slide

  17. おすすめ順で記事を掲載している各種ページ
    リージョンページ 国ページ 地域ページ
    カテゴリページ
    サブカテゴリページ 特集・連載ページ タグページ

    View full-size slide

  18. ❷ おすすめ順でナビゲーション

    View full-size slide

  19. Function score の結果スコアを利用する
    {
    "aggs": {
    "authors": {
    "terms": {
    "field": "author.nav",
    "size": "7",
    "order": [
    {"max_score": "desc"},
    {"_count": "desc"},
    {"_key": "asc"}
    ]
    },
    "aggs": {
    "max_score": {
    "max": {
    "script": {"source": "_score"}
    }
    }
    }
    }
    }
    }
    Function score query で得た
    スコアをMax aggregationで各
    種ナビゲーションの並び順に利
    用する
    スコアの高いおすすめの記事
    が含まれている各種項目(タ
    グ、著者、エリア)でナビゲー
    ションを提供

    View full-size slide

  20. おすすめ順ナビゲーション例
    グローバルナビゲーション 各種ページに関連するフッターナビ
    ゲーション
    各種一覧ページサブカテゴリーナビ
    ゲーション
    リージョン → 国 → 地域
    カテゴリ → サブカテゴリ
    タグ → 関連するタグ

    View full-size slide

  21. ❸ ネストしたナビゲーション

    View full-size slide

  22. ネストしたナビゲーション例
    ❶ リージョンのナビゲーション
    全ての記事群からTerms aggregation でエリアを
    集計してナビゲーションを生成。
    管理サイトで指定された順に掲載。
    ❷ 国・地域のナビゲーション
    各リージョン毎の記事群から Terms aggregationで
    国・地域を集計してナビゲーションを生成。
    Function score query のスコアを使って国・地域の
    並び順を最適化(鮮度+人気+プロモ)。
    エリア一覧ページ


    View full-size slide

  23. # Article document
    {
    “slug”: “roadbike-first-time”,
    “title”: “初心者でも簡単に始められる
    ....”
    “country”: {
    “nav”: “000002#japan#日本国内”,
    ...
    }
    }
    ナビゲーション生成のための非正規化
    ひとつのAggregationで集計できるのは一つのフィールド。非正規化した方が使い勝手が良い
    初心者ロードバイク: Article
    slug = roadbike-first-time
    title = 初心者でも ...
    日本国内: Country
    slug = japan
    order = 2
    name = 日本国内
    【非正規化パターン】
    ❶ 任意の並び順で表示する可能性が あるもの
    “{ order }#{ slug }#{ name }”
    エリア、カテゴリ、etc
    ❷ 任意の並び順で表示する可能性の ないもの
    “{ slug }#{ name }”
    タグ、etc
    ❸ 表示もURLも同じもの
    “{ name }”

    View full-size slide

  24. ❹ ネストしたナビゲーションの応用

    View full-size slide

  25. Terms aggregation
    ネストしたナビゲーションの応用例
    特集・連載一覧
    Top hits aggregation
    Function score query スコア
    Function score query スコア
    特集・連載ごとに集計
    特集・連載ごとに記事を掲載
    「特集・連載一覧」クエリー

    View full-size slide

  26. ❺ フリーワード検索

    View full-size slide

  27. フリーワード検索
    ● 漏れを少なくするため OR 検索をベースに設計
    ○ minimum_should_match を 60% にして、少ない単語数では、適合
    率を重視
    ● 将来多言語対応を考慮して、 ICU アナライザーをベー
    スに言語処理を設計
    ○ 適合率<再現率という方針なので言語固有のアナライザーを採用し
    てません。
    ● カタカナキーワードはフレーズ検索するようにして適
    合率を向上
    ○ ICUアナライザーは未知の単語は細かくトークナイズされる傾向なた
    め、フレーズで検索するようにしています。
    ● おすすめ順スコア+キーワードマッチ度スコアで掲載
    順位を決定
    ○ 再現率重視のためおすすめ順のスコアを考慮すると不自然な検索結
    果になってしまうため、現在はキーワードのマッチ度のみに変更して
    ます

    View full-size slide

  28. メリット・デメリット

    View full-size slide

  29. メリット
    ● データ管理をシンプルに保てる
    ● 柔軟にUXのビジネス要件を実現できる
    ● ビジネス要件を簡単にチューニングできる
    ● バッチ処理が少なくて済む
    ● リクエストして単純に表示するだけなのでUIの開発が簡単
    ○ Elasticsearch のクエリー: ビジネスロジック
    ○ アプリケーション: ただ表示するするだけ

    View full-size slide

  30. ● 検索エンジンの特徴を活かして使わないと、開発が余計に面倒になる
    ○ Elasticsearch != データベース(== 高度なアプリケーションAPIサーバー)
    ● オリジナルのデータ(RDBなど)とは別にデータ設計するので多少面倒
    デメリット

    View full-size slide

  31. こんな使い方も

    View full-size slide

  32. Indices
    {Elasticsearch}
    ❸ いずれかの不適切投
    稿検出条件がマッチした
    場合は不適切投稿と判
    断する
    Percolate query を使って不適切投稿を検知する
    INDEX SIDE
    (Admin side)
    SEARCH SIDE
    (Application side)
    検索条件
    検索条件
    検索条件
    検索条件
    {Percolator query}
    ❶ 不適切投稿を検出するための
    検索条件群を事前に登録する
    登録
    投稿内容
    {doc}
    検索
    検索条件
    結果
    検索条件
    {Percolator query}
    ❷ 投稿内容を検索条件
    として検索する
    管理者
    投稿者
    参考: Elasticsearchで不適切投稿のバリデーションチェックを実装してみた話
    参考: Percolate query | Elasticsearch Guide

    View full-size slide

  33. さいごに(お知らせ)

    View full-size slide

  34. https://file.veltra.com/jp/promotion/se
    kai-no-gohan-at-home/
    世界各国の本格料理をご自宅
    で楽しみませんか?
    日本食レシピサイト。海外のな
    お友達に紹介してください
    https://umami-recipe.com/
    広告、タイアップなどビジネス向けの
    相談は [email protected] まで
    ご連絡ください。
    https://www.veltra.com/jp/yokka/
    まだ間に合う!
    ゴールデンウィークのおともに、
    https://file.veltra.com/jp/promotion/onl
    ineacademy/
    心揺さぶる体験をオンラインで
    お届け

    View full-size slide

  35. 第41回Elasticsearch勉強会
    2021.04.22 #elasticsearchjp
    「Elasticsearchで作る メディアサイト」/ Kunihiko Kido
    ご静聴ありがとうございました

    View full-size slide