気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Elastic Searchとは?

概要

  • 拡張性に優れた全文検索エンジン、複数DBの横断検索が可能、スキーマレスのNoSQL
  • 分析ツール:リアルタイムデータ分析、ログ解析などの分析ができる
  • 関連ツール:ログ集約のLogstashやfluentd、可視化ツールのkibanaと組み合わせて使うことが多い
  • REST APIJSONの送受信で操作する

Elastic Searchの構成要素

Cluster(クラスタ

  • 概要:1つ以上のノードの集合で、データ全体を包括する
  • 検索:インデックスおよびノードの横断的な検索機能を提供する。
  • 識別子:デフォルトではelasticsearch

Node(ノード)

  • 概要:クラスタを構成するサーバ
  • 識別子:デフォルトではノードの起動時に生成されるUUID
  • クラスタ接続:ノードは、クラス名指定でそのクラスタに接続可能。デフォルトはelasticsearchクラスタに接続

ノードの下にインデックスと呼ばれるRDBにおけるDBに値するものを保持する。
以下にRDBと比較しつつ、記載します。

RDBとの違い_概要

ElasticSearchは気軽にデータを保存、削除し、用途に応じたデータ保管形式で保存。
RDBは基本的にデータを永続保管。

  • RDB
    • データ保管:永続的に保管する
    • DB:基本削除しない
    • パフォーマンス:ElasticsearchやNoSQLDBを超えられない。結合処理などがあるため。
  • Elasticsearch
    • データ保管:永続保管ではない。DB(インデックス)を時間間隔やユーザーで区切ったりする、分析や検索用のデータを保管する
    • DB(インデックス):不要になったら捨てる
    • パフォーマンス:拡張性に優れており、パフォーマンスが出しやすい
RDB Elasticsearch
データベース インデックス
テーブル マッピングタイプ
カラム(列) フィールド
レコード(行) ドキュメント

テキスト処理

データ格納時

ElasticsearchではRDBと異なり、テキストデータに関して、挿入データがそのまま格納される訳ではない。
Analyzerという機能により、文字整形や文字分割が行われて格納されている。

  • テキストデータ:textタイプのフィールド ※V5より
  • Analyzer:Tokenizer、Token Filter、Character Filterという文字列分割や変換を行う機能
  • 元データ:stored field(store=trueなフィールド)、または _sourceという特殊フィールドに格納される
  • 特殊フィールド _source:全フィールド(ドキュメント)を保持。設定でデータ圧縮も可能、検索条件不使用フィールドはdisableでインデックスサイズを節約

データ格納例

例1 受信データ:AAA → Analyzer(変換) → aaa
例2 受信データ:「This is a pen」 → Analyzer(分割) ↓

this
is
a
pen

※空白区切り文字で分割、検索時不要文字のピリオドを除去。

データ参照時

検索条件文字列を用いて、検索する際もAnalyzerによって文字列変換や分割文字列の位置情報の利用などが行われます。

データ参照例

例1 クエリ:"term": {"field": "pen"} → 検索ヒット (フィールドには基本小文字で格納されている) 例2 クエリ:"term": {"field": "PEN"} → 検索ヒットせず (termクエリはAnalyzerを用いないため大文字指定ではヒットしない) 例3 クエリ:"match": {"field": "PEN a"} → 検索ヒットせず (matchクエリはAnalyzerを用いるため大文字指定でもヒット。penとaの両方を含む文書がヒット)

マッピングタイプ(テーブル)の特徴

  • マッピングタイプ単位で削除やカラム定義はできないので、RDBのテーブルと同じものと考えてはいけない
  • マッピングタイプ毎に別々のスキーマを保持可能
  • マッピングタイプ全体で、同名のフィールドは同一定義を保持する必要あり

マッピングタイプの定義

フィールド

  • 型:暗黙的に配列型、JSONオブジェクトもほぼそのまま入れられる
  • 値:同じ型の複数の値を保持可能、入力データをトークン毎に切り分けて格納するため、multi-valuedな挙動になっている
  • ソート:配列内の平均値、最大値、中央値といった値を指定してソート条件とする
{
  "f1" : { "p1": 1, "p2": "ABC" } 
}

↓ 変換して扱われる

{
  "f1.p1" : 1, 
  "f1.p2": "ABC" } 
}

フィールドにオブジェクト配列を入れることも可能。その場合は、「nested」というデータタイプを指定する。

データタイプ

Elasticsearch公式

  • 日時の型:DATE, TIME, TIMESTAMPなどはdateにまとまっている
  • 文字列長:CHARとVARCHARのような固定長・可変長の区別なし、最大長は通常指定しない

文字コードUnicodeのみ。異なる文字コードの場合、クライアント側での変更が必要

制約(Constraint)

  • 制約の機能なし。ユニークキーや主キーでレコード(ドキュメント)の一意性を強制はできない
  • ドキュメントの一意性:id、uidで一意性を担保
    • _id:マッピングタイプ内で一意な値。ドキュメントIDを保持するフィールド
    • uid:インデックス内で一意な値。マッピングタイプ名とidの値を区切り文字#で連結したもの

※ドキュメントID:indexAPIの場合はURLの一部、bulkAPIは_idフィールドを指定、未指定の場合は、適当な文字列が設定される

デフォルト値

  • null_valueオプション:nullを明示的に指定した場合のみ有効となり、デフォルト値に近いことができる
  • その他機能でのデフォルト値の機能
    • avg, sumなどの集合関数:metric aggregation
    • ソート: missingオプション

マッピングタイプ変更

  • 変更は基本できない。ALTER TABLE(テーブル変更のクエリ)の代替機能なし
  • 変更時は、インデックス(DB)の再作成、データ再投入が必要

マッピングタイプ削除

  • 削除できない
  • マッピングタイプ内のドキュメントすべて削除するということはできる
POST /index1/_delete_by_query // index名と削除クエリを指定
{
  "query": {
    "type": {
      "value": "type1"  // マッピングタイプを指定
    }
  }
}

elastic(ELK)

ELスタックと呼ばれるセットのサービス Elastic Searchの環境を立ち上げたときにサイドバーに表示されるメニューと使い方は以下

  • Dev tool コンソールでクエリ叩ける

  • Discover 登録データを見れる

参考になる記事