Elasticsearch Sever勉強メモ基本的な概念や基本API、マッピングについて

Elasticsearch Sever』を読んで勉強をしたことの俺得メモです。今回は基本的な概念や基本API、マッピングについてです。

英語ですが、公式ドキュメント『Elasticsearch Reference [2.1]』も充実しているのでななめ読みしています!


🐮 curlを使うときに便利なjq

コマンドラインでのJSONの整形に「jq」が便利でした。良かったらぜひ。

brew install jq

こんな感じでcurlの結果をパイプで渡すと、結果を見やすく整形してくれます。

curl -XPUT http://localhost:9200/post -d '{ "title" : "manual post title 1", "body" : "manual post body 1" }' | jq

詳しい使い方は公式のチュートリアル『Tutorial - jq』あたりがお勧めです

🤔 Elasticsearchの基本概念

Elasticsearchの論理的な構成要素

検索で使うデータの構成要素のイメージ。

- インデックス
  - ドキュメントの集合体。リレーショナルDBのテーブルのようなもの。格納された値は、全文検索に最適化される。
- ドキュメントタイプ
  - 1つのインデックス内に複数のオブジェクトを格納できる。その区分のこと。
- ドキュメント
  - リレーショナルDBのレコードのようなもの。型(type)は自動で決まることも、強制することもできる

Elasticsearchの物理的な構成要素

インデックスを物理的に構成する要素。

- クラスタ(cluster)
  - 複数サーバで協調して動かした場合のサーバ群をクラスタと呼ぶ。
- ノード(node)
  Elasticsearchのプロセスをノードと呼ぶ。クラスタの構成要素。
- シャード(shard)
  - 大量のドキュメントを処理するために、小さな部分インデックスに分割して複数のサーバに格納する。これをシャードという。
  - デフォルトでは5つのPrimary Shardと各Primary Shardごとに1つのReplica Shardに分類される
  - Primary Shard
    - インデックスの書き込みと参照処理で利用される
  - Replica Shard
    - クエリのスループットや高可用性を実現するためにシャードを完全にコピーしたレプリカを作ることができる
    - クラスタ内では自動的にプライマリとなるシャードを選定することができる

Replica Shardは動的に数を変更可能だが、Primary Shardは一度インデックスを作成すると変更できません。

🐹 Elasticsearchの基本的なAPI

Elasticsearchはいろんな操作を行うためのAPIがそろっています。いくつか触りを紹介します。

- インスタンス情報に関するAPI
  - curl -XGET http://localhost:9200/

- インデックス(データの論理的な構造)の操作に関するAPI
  - インデックスの作成
    - curl -XPOST http://localhost:9200/post
  - インデックスの構造取得
    - curl -XGET http://localhost:9200/post
  - インデックスの削除
    - curl -XDELETE http://localhost:9200/post

- ドキュメント(インデックスの中のデータ)の操作に関するAPI
  - ドキュメントの新規作成
    - curl -XPOST http://localhost:9200/post/post -d '{ "id" : 1, "title" : "manual post title 1" }'
  - ドキュメントの更新
    - curl -XPUT http://localhost:9200/post/1 -d '{ "id" : 1, "title" : "manual post title 1" }'
  - ドキュメントの取得
    - curl -XGET http://localhost:9200/post/1
  - ドキュメントの削除
    - curl -XDELETE http://localhost:9200/post/1

🐞 マッピングについて

スキーママッピングとは、インデックスの構造を定義を行うことです。

公式ドキュメント「Mapping | Elasticsearch」がお勧め。

マッピングファイルの作成

マッピング情報を格納する blog.json を作成します。

構造として配下のようになっています。

- ドキュメントタイプ : articles (記事)
- articles のフィールド情報
  - id : 一意の識別子(整数型)
  - title: タイトル(文字列)

では実際のファイルです。

# blog.json
{
"mappings" : {
"articles" : {
"properties" : {
"id" : { "type" : "long", "store" : "yes" },
"title" : { "type" : "string", "store" : "yes", "index" : "analyzed" }
}
}
}
}

ファイルを作ったら次のコマンドでインデックス作成 & マッピングの定義を実行。

$ curl -XPOST 'http://localhost:9200/blog' -d @blog.json | jq

@blog.json はcurlの blog.json を指定するための設定。

マッピングのフィールドの型定義

触りだけだけどこんな感じの基本型(Core Type)がある。

- String : 文字列。アナライザを細かく指定できる。
- Number : 数値。floatやdoubleなどの方がある。
- Date : 日付。フォーマットはいろいろ指定できる。
- Booelean : 真偽値を扱う。
- Binary : BASE64形式のバイナリデータ。画像などを格納するために使う。

それぞれの型情報に対して、さらに属性情報を定義できる。

以下は共通的な型情報です。

- index
  - "analyzed" => 検索可能なフィールド
  - "no" => 検索できないフィールド
  - "not_analized" => アナライザによって処理されないが、完全一致での検索はできる
- store
  - "yes" フィールドにインデックスの元の値を保存する
  - "no" フィールドにインデックスの元の値を保存しない。_sourceを使うと値を取得できる。
- boost
  - フィールドがドキュメントでどのくらい重要かを表す
- null_value
  - 値がない場合に、デフォルトで登録される値
- include_in_all
  - フィールドが _allに含まれるかどうかを設定するフィールド

📚 おすすめの書籍