Elasticsearch 入門。その1

2021.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

prismatix事業部の中村です。

私が開発に携わっているEC/CRMのWebAPIプラットフォーム prismatix では検索サービスを提供しており、その内部では Elasticsearch を利用しています。

今回イチから Elasticsearch を勉強する機会がありましたので、構築方法や使い方を書いていこうと思います。

Elasticsearchとは

Elastic社が提供している Elastic Stackというプロダクト群に含まれる、分散処理が可能検索及び分析エンジンです。 Elastic Stack には、下記のプロダクトが存在します。

  • Elasticsearch : 心臓部となるJSONベースの検索/分析エンジン
  • Kibana : 検索、可視化用のUI
  • Beats : アプリやインフラの統計情報等のデータ収集ツール
  • Logstash : データ収集パイプライン

詳しくは、弊部横山の記事をご参照ください。

【初心者向け】Elastic Stackについて知ろう

Elasticsearchの特徴

Elasticsearch には以下のような特徴があります。

  • スケーラブル
    • 扱うデータ量、リクエスト量に応じてスケールし分散処理が可能
  • リアルタイム
    • すべてのデータに対してほぼリアルタイムでの分析、検索が可能。数値、地理データでも効率的に計算を行える
  • 開発者フレンドリー
    • REST API を提供
  • 高可用性

Elasticsearchのユースケース

例えば Elasticsearch は以下のようなケースで利用されています。

  • Webサイトの検索機能
  • ログやイベントデータの保存・分析
  • 機械学習でリアルタイムにモデルを作成
  • セキュリティ分析
  • 地理情報を利用しての空間情報管理、分析
  • 遺伝子データの分析

ローカルへのインストール

今回はMacにElasticsearchとKibanaをインストールしてみます。 HomeBrewでもインストール出来るのですが、公式からDLする形にします。

Elastic社の公式からElasticsearchKibanaをDLしましょう。

DLしたファイルをそれぞれ解凍します。

% tar xvzf elasticsearch-7.13.2-darwin-x86_64.tar.gz
% tar xvzf kibana-7.13.2-darwin-x86_64.tar.gz

Elasticsearch のディレクトリに移動し中身を確認してみます。

% ls
LICENSE.txt	README.asciidoc	config		jdk.app		logs		plugins
NOTICE.txt	bin		data		lib		modules

Elasticsearch は JVM 上で動いており、以前は端末の JDK を利用していたようですが、Elasticsearch7 から JDK がバンドルされて配布しています。 (jdk.app)

JVMの設定は、 config/jvm.options で行えます。

% ls config
elasticsearch.yml	jvm.options.d		role_mapping.yml	users
jvm.options		log4j2.properties	roles.yml		users_roles

bin にはパスワード設定やセキュリティ設定等の実行ファイルが設置してあります。

% ls bin

elasticsearch				elasticsearch-keystore			elasticsearch-sql-cli
elasticsearch-certgen			elasticsearch-migrate			elasticsearch-sql-cli-7.13.2.jar
elasticsearch-certutil			elasticsearch-node			elasticsearch-syskeygen
elasticsearch-cli			elasticsearch-plugin			elasticsearch-users
elasticsearch-croneval			elasticsearch-saml-metadata		x-pack-env
elasticsearch-env			elasticsearch-service-tokens		x-pack-security-env
elasticsearch-env-from-file		elasticsearch-setup-passwords		x-pack-watcher-env
elasticsearch-geoip			elasticsearch-shard

起動

Elasticsearch を起動するには bin/elasticsearch を実行します。

% ./bin/elasticsearch

### 以下のようなメッセージが出力されれば起動成功
[2021-07-01T15:01:54,182][INFO ][o.e.h.AbstractHttpServerTransport] [local] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}
[2021-07-01T15:01:54,183][INFO ][o.e.n.Node               ] [local] started

次に、kibana を解凍したディレクトリに移動し起動 http://localhost:5601 からKibanaにアクセスが出来ます。

% cd kibana-7.13.2-darwin-x86_64
% ./bin/kibana

### 以下のようなメッセージが出力されれば起動成功
[info][server][Kibana][http] http server running at http://localhost:5601

Elasticsearch Security

Elasticsearch Security という機能が提供されており、認証機能や暗号化、ロールベースのアクセス制御などが簡単に行なえます。

例えば、Elasticsearchの bin/elasticsearch-setup-passwords を実行し、Kibanaの設定ファイルに出力内容を記載することでログイン認証の設定を行えます。

Elasticsearch Security の機能は多岐に渡りますので、以下の公式ページをご参照ください。

https://www.elastic.co/jp/blog/getting-started-with-elasticsearch-security

KibanaでElasticsearchにリクエスト

Kibana には DevTools が実装されており、Elasticsearch に簡単にリクエスト出来ます。 portやエンドポイントを変更しない限り、 何も設定せずにローカルの Elasticsearch に繋いでくれます。

http://localhost:5601/app/dev_tools#/console

左側のフォームは Elasticsearch へのリクエストを入力、右側のフォームが Elasticsearch からのレスポンスが表示されます。

試しに、左側のフォームに GET / を入力し実行ボタンを押すと Elasticsearch の API http://127.0.0.1:9200 にGETでリクエストをし、右側のフォームにレスポンスが表示されます。 このAPIはElasticsearchの情報を返してくれます。

これでローカルでの Elasticsearch と Kibana の環境が整いました。

データ

実際にデータを登録する前に、Elasticsearch のデータの取り扱いと用語について説明します。

ElasticsearchはデータをJSONで扱います。 そのデータを document と言います。

documentを保存する先は、 index と呼ばれ、 index に document を登録することを indexする(動詞)と言います。 (ややこしい)

document はJSONの為、フィールドと値を持ちます。

{
    "field" : "value"
}

各フィールドには型を定義することができ、それをmappingと言います。Elasticsearchではマッピングが未指定の場合、documentの値から自動で型を定義してくれます。

RDBで置き換えると以下のような形になります。

  • index : DB
  • field : カラム
  • document : レコード
  • mapping : スキーマ定義

type というのもあるのですが、現在は非推奨となっており将来的に廃止予定のため割愛します。 ES7では _doc の1種類のみ対応しています。

登録

では実際にElasticsearchに登録していきます。

POST /<index>/_doc API でbodyにindexしたいdocumentを指定します。

レスポンスには結果が返ってきます。

_id にはElasticsearchが付与した、documentを示す一意のIDが割り当てられます。 この値を自分で指定したい場合、 POST /<target>/_create/<_id> のAPIでIDを指定することも可能です。

_shards にはindexしたshard情報が含まれています。ここらへんは次の機会に書く予定です。

index APIについては公式のドキュメントをご参照ください。

PUT でもindex出来ますが、その際には _id の指定が必要となります。

取得

GET /<index>/_doc/<_id> API で先程作成したdocumentの_idを指定します。

検索

documentを検索するには、 GET /<index>/_search APIを呼びます。

bodyに条件を指定するのですが、下記の例では business_name というフィールドに tokyo という値を持ったdocumentを検索し1件HITしています。

{
  "query": {
    "match": {
      "business_name": "tokyo"
    }
  }
}

また、検索条件では tokyo と小文字ですが、結果では Tokyo と頭が大文字になっているのにも注目です。 Elasticsearchではデフォルトで値の大文字を小文字に変換して転置インデックスを作成しています。転置インデックスについても次回説明予定です。

複雑な条件も指定可能で、単語の重み付けや単語が連続していること等を指定が出来ます。

{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "business_name" : {
            "query":  "tokyo",
            "boost": 5
          }
        }},
        {
          "match_phrase": {
            "business_name": "tokyo francisco"
          }
        }
      ]
    }
  }
}

検索方法は複数用意されているので、別途記載予定です。

削除

登録した document を削除するには DELETE /<index>/_doc/<_id> を実行します。

index 毎削除したい場合、 DELETE /<index> で全て削除が可能です。

最後に

今回はElasticsearchとKibanaをインストールし、簡単に触れる環境を作成しました。

次はElasticsearchの仕様等について書いていきたいと思います。

参考

What is Elasticsearch

Elasticsearchのデータ操作入門