SlideShare a Scribd company logo
Elasticsearchの

サジェスト機能を使った話
株式会社アイスタイル

渡邊 紘太朗(@ktaro_w)
第10回 Elasticsearch勉強会 LT

2015/06/011
自己紹介
• 渡邊 紘太朗
• 株式会社アイスタイル
• 2014年度入社(2年目)
• アーキテクチャチーム
• Elasticsearch歴
• 3ヶ月(ほぼサジェスト機能)
• SNS
• Twitter : @ktaro_w
• Qiita : ktaro
2
今日はElasticsearch
サジェスト機能の話
3
背景
• 弊社は、全文検索システム・サジェストシステムを

Elasticsearchに移行中
• プロジェクトに参加した時点では、サジェストは

未着手の状態
• サジェストシステムの移行を担当
4
仕様について
5
仕様
• 現状のサジェストでは、18個のカテゴリが存在
• それぞれに抽出用のSQLクエリ有り
• カテゴリには優先順位がある
• 移行後は、任意のカテゴリを組み合わせら
れるようにする
6
いざ、開発スタート
7
まずは、Mappingを作成
8
Mapping
• 前方一致の「Completion Suggester」
• 利用したパラメータ
• index_analyzer
• インデキシング時のアナライザ設定
• search_analyzer
• 検索時のアナライザ設定
9
Mapping Plugins
1. elasticsearch-analysis-kuromoji
• 日本語形態素解析エンジン
• トークナイズ処理
• フィルタ処理
2. elasticsearch-analysis-icu
• 半角・全角、依存文字を統一化
• char_filter : icu_normalizer
• ㍉ =>「ミ」「リ」、㌢ =>「セ」「ン」「チ」
10
Mapping
• filter
• type : kuromoji_readingform
• use_romaji : true //ローマ字化
• tokenizer
• type : kuromoji_tokenizer
• mode : search
• properties
• type : completion //前方一致
• index_analyzer
• search_analyzer
11
実際にデータを流し込む

(Indexing)
12
Indexing
• 利用したパラメータ
• input
• サジェストデータ入力
• output
• サジェストデータ出力
• weight
• ドキュメントの重み付け
• 今回の移行では、重要な役割
13
Indexing & Search
14
検索時は、POSTメソッドで!
例 : http://localhost:9200/IndexName/_suggest
インデックスが完成!
15
ここで疑問
16
現状のインデックスで

高負荷(リクエスト)

に耐え切れるのか?
17
懸念点
• サジェストシステムはリクエストの頻度が高い
• 現状では、最大で18個のインデックスを

対象にリクエストされる
• サーバーのスケールアップやスケールアウトも難しい
18
検証してみた
19
検証項目
1. 個別のインデックスをプログラムから複数選択

して呼び出す(※複数インデックス)
2. 上記のインデックスが持つドキュメントを

全て含んだ単一のインデックスをプログラム
から呼び出す(※単一インデックス)
20
検証1. 複数インデックス
21
「18」「9」「1」と個別のインデックスにリクエスト
2
17
6
5
4
3
8
9
11
1016
15
14
13
12
17
18
テストツール
ノード
Elasticsearh Server
①
②
検証2. 単一インデックス
22
「18、9、1」のインデックスのドキュメントを含んだ

単一のインデックス「A」にリクエスト
テストツール
ノード
Elasticsearh Server
18 1
18,9,1
・・・
・・・
①
②
A
検証用テスト環境
• サーバー数 - 1台
• ノード数 - 1個
• シャード数 - 5個
• 総ドキュメント数 - 約30000件
23
検証用テストツール
• テストツール「Gatling」
• HTTPリクエストとレスポンスを記録
• グラフィカルに結果を表示
• テストデータとして約20000件の重複のないデータを用意
• テスト項目
• 60秒間でランダムなテストデータを10000リクエスト
• 60秒間にランダムなテストデータを20000リクエスト
24
1回目
25
60秒間で、
10000リクエスト
26
複数インデックス
単一インデックス
• max response time
• 95(ms)
• mean response time
• 2(ms)
• mean requests/sec
• 166.617
• max response time
• 159(ms)
• mean response time
• 4(ms)
• mean requests/sec
• 166.611
2回目
27
60秒間で、
20000リクエスト
28
複数インデックス
• max response time
• 52351(ms)
• mean response time
• 6258(ms)
• mean requests/sec
• 303.467
• max response time
• 4071(ms)
• mean response time
• 135(ms)
• mean requests/sec
• 333.122
単一インデックス
グラフで見てみる
29
30
複数インデックス
単一インデックス
単一インデックスに
軍配が上がる
31
まとめ
• サジェスト機能の学習コストはそこまで高くない
• 日本語の資料は割と少ない
• サジェスト用インデックスは、まとめるが得策
• まとめた上で、並列化
• 重み付けもしやすい
• Gatlingが便利
32
33
Javaエンジニア・インフラエンジニア

絶賛募集中!!!
最後に…
ご静聴

ありがとうございました
34

More Related Content

Elasticsearchのサジェスト機能を使った話