An Elasticsearch Tutorial: Getting Started – Logz.io An Elasticsearch Tutorial: Getting Started

#Note: Elasticは最近、ElasticsearchとKibanaのバージョン7.9以降の新しいバージョンに対してクローズドソースライセンスを導入することを発表しました。 詳細は、Truly Doubling Down on Open Source に掲載された当社 CEO Tomer Levy のコメントをご覧ください。

Elasticsearch は、今日最も人気のあるログ分析プラットフォームである ELK Stack (Elasticsearch, Logstash and Kibana) の心臓部として生きているものです。 Elasticsearchの役割は非常に中心的で、スタックそのものの名前と同義になっています。 主に検索とログ解析のために、Elasticsearch は今日、最も人気のあるデータベースシステムの 1 つです。 このElasticsearchチュートリアルでは、新規ユーザがElasticsearchを使い始めるために必要な知識とツールを提供します。 インストール方法、最初のインデックス作成とデータ処理の手順が含まれています。

Elasticsearchとは?

2010年にリリースされたElasticsearch(ESと呼ばれることもあります)は、Apache Luceneをベースにした最新の検索および分析エンジンです。 完全にオープンソースで、Javaで構築され、ElasticsearchはNoSQLデータベースです。 つまり、非構造化された方法でデータを保存し、SQL を使用してクエリすることはできません。

この Elasticsearch チュートリアルは、NoSQL チュートリアルと見なすこともできます。 しかし、ほとんどの NoSQL データベースとは異なり、Elasticsearch は検索機能と特徴に強く焦点を当てています – 実際、ES からデータを取得する最も簡単な方法は、広範な Elasticsearch API を使用してデータを検索することであるほどです。

データ分析の文脈では、ElasticsearchはELK Stackの他のコンポーネント、LogstashとKibanaと共に使用され、データのインデックスとストレージの役割を果たします。

Elasticsearchのインストール

Elasticsearchの要件はシンプルです。 Java 8(特定のバージョンを推奨:Oracle JDKバージョン1.8.0_131)です。 このLogstashのチュートリアルを見て、セットされていることを確認してください。 また、お使いのオペレーティングシステムがElasticのサポートマトリックスに載っていることを確認してください。 それが終わったら、Elasticsearch のインストールから始めましょう。

Elasticsearch はスタンドアロンのディストリビューションとしてダウンロードするか、apt および yum リポジトリを使用してインストールすることが可能です。 ここでは、AWS EC2上で動作するUbuntu 16.04マシンに、aptを使用してElasticsearchをインストールすることにします。

まず、ダウンロードしたパッケージを検証できるように、Elasticの署名キーを追加する必要があります(すでにElasticからパッケージをインストールしている場合は、この手順をスキップします):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Debianの場合は、次にapt-transport-httpsパッケージをインストールする必要があります:

sudo apt-get install apt-transport-https

次のステップは、リポジトリ定義をシステムに追加する方法です。

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

あとは、リポジトリの更新と Elasticsearch のインストールです。

sudo apt-get updatesudo apt-get install elasticsearch

Configuring Elasticsearch

Elasticsearch の設定は、OS によって場所が異なる設定ファイルを使用して行われます。 このファイルでは、一般的な設定(ノード名など)、ネットワーク設定(ホストやポートなど)、データの保存場所、メモリ、ログファイルなどを設定できます。

開発やテスト目的の場合、デフォルト設定で十分ですが、本番に入る前にどの設定を手動で定義すべきか、いくつか調査することをお勧めします。

たとえば、特にクラウド上に Elasticsearch をインストールする場合、Elasticsearch をプライベート IP または localhost にバインドするのが良いベストプラクティスとなります。 Elasticsearchをどのように実行するかは、お使いのシステムによって異なります。 ほとんどのLinuxやUnixベースのシステムでは、次のコマンドを使用できます:

sudo service elasticsearch start

そして、これで完了です。

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Elasticsearchの実行プロセスをデバッグするには、/var/log/elasticsearch/にあるElasticsearchログファイルを使用します(Debの場合)。 Elasticsearchにデータを投入すると、Apache Luceneのインデックスにデータが配置されるからです。 ElasticsearchはLuceneインデックスを使用してデータの保存と検索を行うため、これは理にかなっています。
Elasticsearch は REST API のように動作しますので、データを追加するには POST または PUT メソッドのいずれかを使用します。 データ項目のidが分かっている、もしくは指定したい場合はPUTを、Elasticsearchにデータ項目のidを生成させたい場合はPOSTを使います:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

そして応答:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

文書用のデータはJSONオブジェクトとして送信されています。 データの構造を定義せずに、どうやってデータのインデックスを作成するのか、不思議に思うかもしれません。 さて、Elasticsearchでは、他のNoSQLデータベースと同様に、事前にデータの構造を定義する必要はありません。 しかし、最適なパフォーマンスを確保するために、データ型に応じたElasticsearchのマッピングを定義することができます。 これについては後で説明します。

Beats シッパー (例: Filebeat または Metricbeat) のいずれか、または Logstash を使用している場合、ELK Stack のこれらの部分は自動的にインデックスを作成します。

Elasticsearch インデックスのリストを表示するには、以下を使用します。

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

この場合のリストには、上で作成したインデックス、Kibana インデックス、Logstash パイプラインで作成したインデックスが含まれます。

Elasticsearch クエリング

Elasticsearch にデータをインデックスしたら、検索と分析を始めることができます。 最も簡単なクエリは、1つのアイテムを取得することです。 Elasticsearchのクエリに特化した記事をお読みください。

再び、Elasticsearch REST APIを介して、GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

そしてレスポンス:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

アンダースコアで始まるフィールドはすべて結果のメタ・フィールドです。 _source オブジェクトはインデックスが作成された元のドキュメントです。
また、_search エンドポイントを呼び出して検索を行うために GET を使用します:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

結果は、検索と結果の両方を記述する多くの追加フィールドを含みます。 以下はその概要です。

  • took: 検索にかかった時間(ミリ秒)
  • timed_out: If the search timed out
  • _shards: 検索した Lucene シャードの数、その成功率と失敗率
  • hits.1: 検索したシャードの数、およびその失敗率
      took: 検索にかかった時間(マイクロ秒)
  • took: 検索にかかった時間(ミリ秒)

上記で行った検索はURI検索として知られており、Elasticsearchに問い合わせる最も簡単な方法です。 単語を指定するだけで、ESはその単語を含む全ドキュメントの全フィールドを検索します。

  • username:johnb – usernameフィールドが「johnb」
  • john* – johnで始まり、「john」「johnb」「johnson」など0文字以上が続く用語を含むドキュメントを検索します
  • john? – johnで始まり、その後に1文字だけ続く用語を含む文書を探します。 johnb” と “johns” にはマッチするが “john” にはマッチしない。

他にも、ブール論理の使用、用語のブースト、ファジー検索や近接検索の使用、正規表現の使用など、検索方法はたくさんあります。 Elasticsearch は、より高度な検索を行うためのクエリ DSL でリクエスト ボディ検索も提供します。 この種の検索では幅広いオプションが用意されており、さまざまなオプションを組み合わせて、必要な結果を得ることができます。

これには 2 種類の句が含まれています。

Elasticsearch Query Types

この種の検索ではさまざまなオプションが利用でき、異なるオプションを組み合わせて必要な結果を得ることができます。 クエリーの種類は以下のとおりです。

  1. Geo クエリ。
  2. 「More like this」クエリ
  3. スクリプトクエリ
  4. 全文クエリ
  5. シェイプクエリ
  6. スパンクエリ
  7. 用語レベルクエリ
  8. 専門クエリ
  9. Elasticsearch 6.A で は、以下のクエリに対応しました。8 では、ELK Stack は Elasticsearch queries と Elasticsearch filters を統合しましたが、ES ではまだコンテキストで区別しています。 DSLでは、クエリクローズに対して、フィルタコンテキストとクエリコンテキストを区別しています。 フィルタコンテキストの句は、ブーリアン方式でドキュメントをテストします。 ドキュメントがフィルタにマッチするかどうか、”yes” か “no” か。 フィルタも一般にクエリより高速ですが、クエリは文書がクエリにどれだけ近いかによって関連性スコアを計算することもできます。 フィルタは、関連性スコアを使用しません。 これは、ドキュメントの順序と包含を決定します:

    curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

    そして結果:

    { "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

    Creating an Elasticsearch Cluster

    Maintaining an Elasticsearch cluster can be time-cuming、特にDIY ELKを行っている場合、です。 しかし、Elasticsearch の強力な検索および分析機能を考慮すると、そのようなクラスターは不可欠なものです。 Elasticsearch クラスター チュートリアルでこのテーマを深く掘り下げていますので、これを足がかりに、より徹底したウォークスルーを行っていきます。

    正確には、Elasticsearch クラスターとは何でしょうか。 Elasticsearch クラスターは、複数の Elasticsearch ノードおよび/またはインスタンスをグループ化したものです。 もちろん、クラスタ内で単一のElasticsearchインスタンスまたはノードを維持することも可能です。 このようなグループ化の主なポイントは、タスク、検索、インデックス作成をクラスタのノードに分散させることにあります。 ノード オプションには、データ ノード、マスター ノード、クライアント ノード、およびインジェスト ノードがあります。

    ノードのインストールには多くの設定が必要で、前述のチュートリアルで説明しています。 しかし、ここでは基本的なElasticsearchクラスタノードのインストールを紹介します:

    何よりもまず、Javaをインストールします:

    sudo apt-get install default-jre

    次に、Elasticsearchのサインインキーを追加してください。

    wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

    次に、Elasticsearchの新しいイテレーションをインストールします。

    sudo apt-get update && apt-get install elasticsearch

    各Elasticsearchノードの elasticsearch.yml 設定ファイル (sudo vim /etc/elasticsearch/elasticsearch.yml) を作成またはセットアップする必要があります。 ここから、Elasticsearchを起動し、Elasticsearchクラスタの状態を確認します。

    { "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

    Elasticsearch クラスタの状態については、次のように表示されます。 以下のAPIコールで定期的にクラスタの状態を確認してください:

    curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

    この例では、パラメータ localfalse としています(実際にはデフォルトです)。 これにより、マスターノードのステータスが表示されます。 ローカルノードを確認するには、true に変更します。

    レベルパラメーターは、デフォルトではクラスタの状態を表示しますが、それ以上のランクには indicesshards があります (上記の例と同様)。

    タイムアウトのための追加のオプションのパラメータがあります…

    timeout
    master_timeout

    …or, to wait for certain events to occur:

    wait_for_active_shards
    wait_for_events
    wait_for_no_initializing_shards
    wait_for_no_relocating_shards
    wait_for_nodes
    wait_for_status

    Removing Elasticsearch Data

    Elasticsearch からアイテムを削除するには Elasticsearch へのデータ入力と同じくらい簡単に行うことができます。 今回使用するHTTPメソッドは、DELETE:

    $ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

    インデックスを削除する場合:

    $ curl -XDELETE 'localhost:9200/logs?pretty'

    すべてのインデックスを削除する場合(細心の注意を払って使用):

    $ curl -XDELETE 'localhost:9200/_all?pretty'$

    どちらの場合も、レスポンスは以下のようになります。

    このチュートリアルは、Elasticsearchの初心者を支援し、そのようにElasticsearchのCRUD操作の基本ステップだけを提供します。 Elasticsearch は検索エンジンであり、その検索機能には非常に深い特徴があります。
    最近のバージョンでは、いくつかの驚くべき新しい Elasticsearch 機能と、基本的なデータ構造への大きな変更が導入されました。

コメントを残す

メールアドレスが公開されることはありません。