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

Elasticsearch Education

Elasticsearch Education

初心者向けに実施したElasticsearch社内勉強会の資料です。

Akira Morikawa

April 10, 2018
Tweet

More Decks by Akira Morikawa

Other Decks in Technology

Transcript

  1. 2つのアプローチ ①既存のRDBMSに組み込む ②全文検索システムを構築する Oracle Oracle Text MySQL Mroonga(Groonga) PostgreSQL PGroonga(Groonga)

    ・SQLがそのまま使える ・既存リレーションを流用できる ・複雑な結合検索が可能 Lucene http://lucene.apache.org/ Solr http://lucene.apache.org/solr/ Elasticsearch https://www.elastic.co/ ・より洗練された高速システム ・ファセット等の高度検索が使える ・システムの拡張性が高い
  2. インデックスの仕組み ①Char Filter テキストに対して事前処理をする。 例)HTMLタグ削除、カナ→かな、LowerCase、等 ②Tokenizer テキストをアルゴリズムに基づき単語(トークン)に分割する。 ③Token Filter 単語ごとに事後処理をする。

    例)動詞を原形に統一する、名詞を単数形に統一する、長音除去、等 Elasticsearchでは、それぞれがプラグイン(拡張機能)として提供されている。 https://www.elastic.co/guide/en/elasticsearch/plugins/current/index.html
  3. インデックスの仕組み - Tokenizer ①形態素解析 例)今日はいい天気です 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ いい

    形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ 天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス ※この例だと「はい」等で検索してもヒットしない
  4. インデックスの仕組み - Tokenizer ②N-Gram 予め指定したN文字単位で文字を分割してインデックスする手法。 ・Uni-gram (1グラム) → 1文字ずつインデックスを作成する。 ・Bi-gram(2グラム)

    → 2文字ずつインデックスを作成する。  : この仕組みでは検索漏れが発生せず辞書も必要ないが、辞書肥大化と検索ノイズ発生が 懸念される。 ※検索ノイズ … たとえば「京都」を検索する場合、「東京都庁」の中間文字がヒットする。
  5. インデックスの仕組み - Tokenizer ②N-Gram 例)今日はいい天気です 今日 / 日は / はい

    / いい / い天 / 天気 / 気で / です ・この仕組みでは検索漏れが発生せず、単語辞書も必要ない。 ・形態素解析と比べインデックスサイズが大きい。 ・検索ノイズが発生する。  ※たとえば「京都」を検索する場合、「東京都庁」の中間がヒットする。
  6. インデックスの仕組み - Tokenizer N-gram 形態素解析 インデックス速度 速い 遅い インデックスサイズ 大きい

    小さい 検索ノイズ 多い 小さい 検索漏れ 少ない 多い 検索速度 遅い 速い 言語辞書 不要 必要 Tokenizerアルゴリズムの特徴まとめ
  7. 検索精度 全文検索はその仕組み上、入力されたキーワードに対して完全一致検索を行わないため、 取得データが完璧な精度にならない。 用語 英名 説明 正しい結果 True Positive 検索結果として返していて、ユーザが求めていた情報。

    検索ノイズ False Positive 検索結果として返していて、ユーザが求めていない情報。 検索漏れ False Negative ユーザが求めているのに、検索結果に含ませない情報。 ※不正確なデータは防ぎようがなく、一方を減らすともう一方が増えてしまう。  →検索ノイズは我慢できるけど、検索漏れは防ぎたいよね?
  8. Shard = データの分割数 システム構成の基本 Cluster Data Primary Shard #0 Primary

    Shard #1 Primary Shard #N : Replica Shard #0 Replica Shard #1 Replica Shard #N Replica #0 Replica #N ・・・ Shard & Replica Replica = Shardの複製数
  9. システム構成の基本 Cluster Data Node Data Node Data Node Primary Shard

    #0 Replica Shard #0 ・・・ ・・・ データの配置 Shard×Replicaの数に応じて、自動配置される ※最大でShard×Replica台までスケール ※Primary/Replicaいずれか生存で可用性を保証
  10. システム構成の基本 ノードの種類 ①Master-eligible Node  シャードを管理する機能を有するMaster Nodeの候補となる。  この中からMaster Nodeが自動選出される。  ※Split Brain対策として台数は2n-1台とする必要がある。

    ②Data Node  データを保持・操作(CRUD)する為のノード。  ※マスターノードと兼務する事が可能。 ③Ingest Node… データのパイプライン処理(自動変換)を行う為のノード。 ④Tribe Node … 複数クラスタを接続して横断検索する場合に必要なノード。
  11. Elasticsearchの歴史 ネットの古い記事はやばい ・これまでバージョン1→2→5→6と変遷してきた ・リリース頻度は年1回程度(のはず) ・他に類を見ない Breaking Changes のバーゲンセール ・2→5では仕様変更のせいで大量のプラグインがDISCONになった ・5→6ではTypeが廃止になった

    ・今後も仕様変更がいっぱいあると思うのでバージョンアップは相当やばい ・数年前の記事は割と使えない事が多い ・機能が追加されまくってるんできっと幸せになれる事もあるはず ↓阿鼻叫喚レベルの仕様変更たち https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking-changes-5.0.html https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking-changes-6.0.html
  12. データ定義 Index データの定義 type name email description isbn type author

    name 森川 晃 email [email protected] type book name ケーキの焼き方 description 誰でも焼けます~ isbn 1234-5678-9000001 ↑ Flat mapping Type
  13. データ定義 GET http://localhost:9200/_search { "query": { "bool": { "must": {

    ← 検索条件設定(重み付けに影響 する) "match": { "name": "森川 晃" } }, "filter": { ← フィルタ設定(重み付けに影響 しない) "match": { "type": "author" } } } } } データの検索方法 独自のQueryDSLというJSONを記述して、検索する。
  14. データ定義 データ型 通常のRDBMSと同様の型が存在する。 テキスト型 text, keyword 数値型 long, integer, short,

    byte, double, float, half_float, scaled_float 日付型 date 真理値型 boolean バイナリ型 binary 範囲型 integer_range, float_range, long_range, double_range, date_range その他 Array, Object, Nested, … etc.
  15. データ定義 マッピング定義 Elasticsearchに予めマッピング情報を定義する事ができる。 ・settings … index, analysis 等の基本情報を設定する。 ・mappings …

    フィールドマッピングを設定する。 ドキュメント登録時に同名のフィールドが存在する場合、マッピング定義に基づいてインデッ クス処理される。 ※同一フィールド名が存在しない場合もエラーとならない為、注意が必要。
  16. データ定義 マッピング定義 マッピング時に利用できるオプションでよく使うものは以下の通り。 analyzer settings.analysis.analyzer定義名 index インデックスし、検索対象とするか( true/false) ※ES6から仕様変更になったので注意 store

    オリジナルデータを”store”リストに保持するか( true/false) ※設定しなくても”_source”リストからとれるが、こちらのほうが高速 fielddata データをメモリキャッシュしソート対象とするか( true/false) ※text型はデフォルトfalseとなるため、利用する場合には設定が必要
  17. データ定義 親子関係の構築 Type内のデータ同士に親子関係を持たせるためにJoin Data Typeがある。 { "mappings": { "doc": {

    "properties": { "parent_or_child": { ← 結合キー名(名前はなんでもいい) "type": "join", “relations”: { “target”: “child” ← 親子識別キーワード(名前はなんでもいい) } } } } } } Elasticsearch 6.1 - Join Data Type https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html