Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

● 木戸国彦(キド クニヒコ) ○ ベルトラ株式会社 / 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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

はじめに

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

なぜ Elasticsearch を使うのか?

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

サイトナビゲーションのための階層構造はデータ 管理には不要なためシンプルに保てる 階層構造を管理する管理者が不要、データ移行や再利用もしやすいメリットがある データ管理をシンプルに保ちたい 記事 スラッグ コンテンツ 国 スラッグ 名前 地域 スラッグ 名前 1 * * * * * 記事 スラッグ コンテンツ 国 スラッグ 名前 地域 スラッグ 名前 * * * * ビジネス要件RDB、データ管理RDB のデータ管理設計例 ビジネス要件Elasticsearch、データ管理RDB のデータ管理設計例 サイトナビゲーションのための階層構造など複 雑になっていく ◀国にしか関連づけない データも

Slide 10

Slide 10 text

UXのビジネス要件を柔軟に実現したい 記事 スラッグ コンテンツ 国 スラッグ 名前 地域 スラッグ 名前 * * * * 著者 名前 1 * ツリー ファセット ハイパーリンク ウィザード {Elasticsearch} シンプルなデータ構造 Elasticsearch を使うと Aggregations を使ってデータ構造を 買えずに様々なナビゲーションを実現できる

Slide 11

Slide 11 text

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 %

Slide 12

Slide 12 text

YOKKA (よっか) の Elasticsearch 活用例

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

おすすめ順=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" } プロモーションかどうか のスコアリング いいね数の スコアリング 記事の公開日時 のスコアリング

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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で各 種ナビゲーションの並び順に利 用する スコアの高いおすすめの記事 が含まれている各種項目(タ グ、著者、エリア)でナビゲー ションを提供

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

# 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 }”

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

❺ フリーワード検索

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

メリット・デメリット

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

こんな使い方も

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

さいごに(お知らせ)

Slide 34

Slide 34 text

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/ 心揺さぶる体験をオンラインで お届け

Slide 35

Slide 35 text

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