ElasticSearch
概要
- スケーラビリティに優れた全文検索エンジン
- ログ集約のLogstashやfluentd、可視化ツールのkibanaと一緒に使われることが多い
- 複数のデータベースを横断して検索することが、ごく当たり前の用途として提供されている
全文検索
- 大量にあるドキュメントデータ(Jsonファイル)の中から、目的のワードを含むドキュメントデータを検索するための仕組み
用語
- クラスタ、ノード ClusterとはNodeの集合体です。 Nodeとはサーバーと同じ概念のレベルのもので、1台のサーバーに1Node用意します。 トラフィックが増加した場合は、Nodeを増やすことで、処理速度の分散ができるような仕組みになっています。
- インデックス RDBのDatabaseの概念レベルに該当します。 1つのClusterに複数のIndexが作成できます。
- タイプ RDBのTableの概念レベルに該当します。 1つのIndexに複数のTypeが作成できます。
- ドキュメント RDBのRowの概念レベルに該当します。 idをキーにして個々のデータを管理します。
- シャード RAIDで構成されたハードディスクと似た仕組みになります。 1つのindexを作成すると、合わせてShadが複数作成されます。indexを分割したものがshadになるイメージ。 ShardはPrimary(master)とReplicaで構成されており、1Nodeには1shard配置されます。 例えばPrimaryがすでに存在するShardには同じNodeにReplicaは存在できず、別のNodeに配置されます。
使い所
JSONで定義されたファイル内の検索をしたい場合
以下に実際のユースケースが何個か載ってる https://dev.classmethod.jp/articles/elasticsearch-getting-started-05/
実際に動かす
以下のelasticsearchクラスタの起動
以降を参照
https://qiita.com/kiyokiyo_kzsby/items/344fb2e9aead158a5545
docker用語
- soft 一般ユーザ権限で変更可能の最大値
- hard root権限で変更可能の最大値
- ulimits
- memlock メモリ内にロックされるアドレス空間の最大値
- nofile オープンできる最大ファイル数
- nproc 最大プロセス数
- volumes
- driver localの場合、ローカルのファイルシステムと指定のコンテナをマウントする。
templateの設定
- indexの設定を使い回したい時に使う
curl -H "Content-Type: application/json" -XPUT localhost:9200/_template/classmethod -d { index_patterns" : ["classmethod*"], "order": 0, "settings": { "number_of_replicas": 0 }, "mappings": { "employees": { "dynamic_templates": [ { "string_template": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } } } } ], "properties": { "location": { "type": "geo_point" }, "friends": { "type": "nested" } } } } }
上記の場合、index_pattersにマッチしたindexを作成した場合(今回はclassmethod*
という名前)、employees
がtype、location
、friends
がfieldsの設定がindexに反映される。
alias
- 別名の複数インデックスを同じ名前とすることで、複数インデックスに跨った検索を簡単に行えるようにする。
- アプリケーション側を修正することなく、対処のインデックスを変更することができる。
curl -H "Content-Type: application/json" -XPUT localhost:9200/_aliases -d { "actions": [ { "remove": { "index": "mierun-jimujigyo-master-v0.1", "alias": "mierun-jimujigyo-master" } }, { "remove": { "index": "mierun-jimujigyo-years-v0.1", "alias": "mierun-jimujigyo-years" } }, { "add": { "index": "mierun-jimujigyo-master-v0.1", "alias": "mierun-jimujigyo-master" } }, { "add": { "index": "mierun-jimujigyo-years-v0.1", "alias": "mierun-jimujigyo-years" } } ] }
少し高度なドキュメント管理方法
- 存在しない場合のみ新しいドキュメントを作成する
- ドキュメントの一部を更新する
- スクリプトを使ってドキュメントの一部を更新する
- 楽観的並行性制御(optimistic concurrency control)
- 有効期限つきドキュメントをインデックスする(TTL) https://dev.classmethod.jp/articles/elasticsearch-getting-started-03/#advanced-04