『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 |
ファイルを作ったら次のコマンドでインデックス作成 & マッピングの定義を実行。
$ 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に含まれるかどうかを設定するフィールド