学習備忘ログ

よく使うコードや設定のメモ

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

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、locationfriendsが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"
      }
    }
  ]
}

少し高度なドキュメント管理方法