Slide 1

Slide 1 text

マッピング設定最適化によるパフォーマンス改善の取り組み + match_only_textのパフォーマンス検証
 2021/08/26
 第43回Elasticsearch勉強会
 株式会社ZOZOテクノロジーズ
 EC基盤本部 検索基盤チーム エンジニア
 有村 和真 Copyright © ZOZO Technologies, Inc.

Slide 2

Slide 2 text

© ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 EC基盤本部 検索基盤部 検索基盤チーム
 エンジニア 有村 和真
 2019年4月 新卒入社
 スパイスカレーにハマり中。自家栽培唐辛子おいしい。
 
 @pakio / @paki0o 
 
 
 2

Slide 3

Slide 3 text

© ZOZO Technologies, Inc. https://zozo.jp/
 3 ● 日本最大級のファッション通販サイト
 ● 1,400以上のショップ、8,200以上のブランドの取り扱い(ともに2021年3月 末時点)
 ● 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品 を掲載
 ● コスメ専門モール「ZOZOCOSME」や靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 ● 即日配送サービス
 ● ギフトラッピングサービス
 ● ツケ払い など


Slide 4

Slide 4 text

© ZOZO Technologies, Inc. アジェンダ
 ● 背景・課題・概要
 ● 検証内容
 ○ index/doc_values/enabled
 ○ index_options/norms/match_only_text
 ● 検証結果
 ● まとめ
 ● Appendix
 4

Slide 5

Slide 5 text

© ZOZO Technologies, Inc. 背景・課題・概要
 5

Slide 6

Slide 6 text

© ZOZO Technologies, Inc. 背景・課題
 ● ZOZOTOWNでは商品情報の更新をリアルタイムにインデキシングしている
 ○ => 検索だけでなく、インデキシングの負荷も大きい
 ● フィールドは今後も追加される見込み
 ● 大きくアプリケーションやバッチに手を入れず、手っ取り早くパフォーマンスを上げたい
 
 取り組みの概要
 ● マッピングの変更のみでどこまでパフォーマンスを最適化できるか探る
 ○ インデキシング速度
 ○ インデックスサイズ
 ● 指定するべきベストなオプションを、フィールドの用途に応じて判断できるようにする
 6

Slide 7

Slide 7 text

© ZOZO Technologies, Inc. もともとのマッピングの状態
 
 7 商品ごとにユニークなコード 検索、ソートで使用 キーワード検索用情報 検索でしか使わない 商品に関するメタ情報 scriptで使用

Slide 8

Slide 8 text

© ZOZO Technologies, Inc. もともとのマッピングの状態
 
 8 商品ごとにユニークなコード 検索、ソートで使用 キーワード検索用情報 検索でしか使わない 商品に関するメタ情報 scriptで使用 フィールドごとの用途が明確 用途に合わせて、設定を最適化する

Slide 9

Slide 9 text

© ZOZO Technologies, Inc. テックブログに書いたところ…
 
 9 Elasticsearchのマッピング設定最適化による インデキシングパフォーマンス改善への取り組み 7.14から新たなデータ型が追加になるとの情報。 今回はこちらも合わせて検証。

Slide 10

Slide 10 text

© ZOZO Technologies, Inc. 新たなデータ型 : match_only_text
 
 ● v7.14.0 の新機能
 ● 高効率にデータを保存可能
 ○ サイズはindex_options: docs × norms: falseと同等
 
 ● インデックスサイズを抑えつつ、match_phraseクエリが発行可能
 ○ ただしPhraseQueryではなく、_sourceを使って裏で色々やるので重め
 
 ● Analyzerは指定できず、デフォルトのみ
 10

Slide 11

Slide 11 text

© ZOZO Technologies, Inc. 検証内容
 11

Slide 12

Slide 12 text

© ZOZO Technologies, Inc. 設定の最適化 - ①パラメータの指定 (全タイプ共通)
 
 
 12 用途 index=false doc_values=false enabled=false 検索 × 〇 × script 〇 × × ソート 〇 × × 集計 〇 × × _source 〇 〇 〇

Slide 13

Slide 13 text

© ZOZO Technologies, Inc. 設定の最適化 - ②パラメータの指定 (テキスト)
 
 
 type : text type : match_only_text 用途 index_options: docs index_options: freqs index_options: positions index_options: offsets norms: false term 〇 〇 〇 〇 〇 〇 match △ scoreが不正確 〇 〇 〇 △ scoreが不正確 △ scoreを1.0に固定 phrase × × 〇 〇 △ scoreが不正確 △ scoreを1.0に固定 速度低下 ※1 highlight 〇 〇 〇 ◎ 高速 〇 〇 13 ※1 Appendix 1

Slide 14

Slide 14 text

© ZOZO Technologies, Inc. 設定の最適化 - ②パラメータの指定 (テキスト)
 
 
 type : text type : match_only_text 用途 index_options: docs index_options: freqs index_options: positions index_options: offsets norms: false term 〇 〇 〇 〇 〇 〇 match △ scoreが不正確 〇 〇 〇 △ scoreが不正確 △ scoreを1.0に固定 phrase × × 〇 〇 △ scoreが不正確 △ scoreを1.0に固定 速度低下 ※1 highlight 〇 〇 〇 ◎ 高速 〇 〇 14 ↑ 今回の検証ではスキップ

Slide 15

Slide 15 text

© ZOZO Technologies, Inc. 設定の最適化 - テストパターン一覧
 
 ● 1. ZOZOTOWN商品インデックス
 ○ 1.1. 最適化なし
 ○ 1.2. index/doc_values/enabled を指定
 ○ 1.3. 1.2. + index_options/norms を指定
 
 ● 2. Rallyのhttp_logs(一部抜粋)
 ○ 2.1. Rallyのデフォルト設定
 ○ 2.2. requestの型を match_only_text に変更
 15

Slide 16

Slide 16 text

© ZOZO Technologies, Inc. Rally 
 
 ● 既存インデックスから負荷試験トラックを作成可能
 16 ~ $ esrally create-track --track={保存名} --target-hosts=localhost:9200 --indices="{インデックス名}" --output-path={保存先} ~ $ tree sample sample ├── test-documents-1k.json ├── test-documents-1k.json.bz2 ├── test-documents.json ├── test-documents.json.bz2 ├── test.json └── track.json --- サンプリングされたドキュメント --- 抽出したドキュメント --- インデックス定義 --- 負荷試験シナリオ https://github.com/elastic/rally

Slide 17

Slide 17 text

© ZOZO Technologies, Inc. 検証結果
 17

Slide 18

Slide 18 text

© ZOZO Technologies, Inc. 設定の最適化 - テストパターン一覧
 
 1. ZOZOTOWN商品インデックス
 18 最適化なし index/doc_values/enabled 左記 + index_options/norms Store Size (GB) 15.9505 13.6557 (-14%) 12.8959 (-19%) Median Throughput (docs/s) 2610 2881 (+10%) 2706 (+4%) 90th percentile latency (ms) 5018 4057 (-19%) 3898 (-22%) すべての指標で改善

Slide 19

Slide 19 text

© ZOZO Technologies, Inc. 設定の最適化 - テストパターン一覧
 
 2. http_logsインデックス
 19 デフォルト設定 match_only_text Store Size (GB) 0.832119 0.740166 (-11%) Median Throughput (docs/s) 71104.4 73727.5 (+4%) 90th percentile latency (ms) 77.0814 75.6037 (-2%) すべての指標で改善

Slide 20

Slide 20 text

© ZOZO Technologies, Inc. 一方でデメリットも…
 
 ● 付与したオプションで使用できないものが使いたくなった
 ○ 再インデキシングが必要
 
 ● スコアが使えないため、サイトの検索などではつらいかも
 
 
 
 20 デメリットと向き合いつつ、 適材適所で使うことで程よく削減

Slide 21

Slide 21 text

© ZOZO Technologies, Inc. まとめ
 21

Slide 22

Slide 22 text

© ZOZO Technologies, Inc. まとめ
 
 ● マッピングのオプション一つでお手軽にパフォーマンス向上
 ○ 特にmatch_only_textは検索も柔軟にできるので、ログ用途だとお得そう
 
 ● フィールドの用途に応じて機械的に判断可能
 
 ● デメリットもあるので、ご利用は計画的に
 22

Slide 23

Slide 23 text

© ZOZO Technologies, Inc. We are hiring !
 
 23 https://hrmos.co/pages/zozotech/jobs/0000034

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

© ZOZO Technologies, Inc. Appendix
 25

Slide 26

Slide 26 text

© ZOZO Technologies, Inc. Mapping Query document 1. match_only_text型のフィールドに対してPhraseQuery
 
 26

Slide 27

Slide 27 text

© ZOZO Technologies, Inc. 1. match_only_text型のフィールドに対してPhraseQuery - Profiler
 
 27 ① Phraseクエリで指定した文を トークン毎に、Termクエリで検索

Slide 28

Slide 28 text

© ZOZO Technologies, Inc. 1. match_only_text型のフィールドに対してPhraseQuery - Profiler
 
 28 ② 得られたドキュメントの_sourceを用いて、疑似 的にPhraseクエリを再現 https://github.com/elastic/elasticsearch/blob/76a684ad322ddb8da2f20862 e8050aa4ad148a37/modules/mapper-extras/src/main/java/org/elasticsear ch/index/query/SourceConfirmedTextQuery.java

Slide 29

Slide 29 text

© ZOZO Technologies, Inc. 1. match_only_text型のフィールドに対してPhraseQuery - Profiler
 
 29 ③全てのドキュメントに対して、 固定のスコアを付与

Slide 30

Slide 30 text

© ZOZO Technologies, Inc. 2. http_logsの負荷検証について
 
 30 以下リポジトリにアップロード予定 https://github.com/pakio/elasticsearchJp-20210826