ちょっと話題の記事

初心者のためのElasticsearchその1

2018.07.20

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

はじめに

本稿では、とりあえずElasticsearchとkibanaをインストール後、
基本的なAPIをつかって動かしてみます。

Elasticsearchとは

超ざっくり特徴を言うと、

  • Elastic社が開発している、LuceneベースでOSSの全文検索エンジン
  • RESTでアクセス可能。最近SQLも使えるようになった
  • 検索エンジン界隈では一番人気(らしい)

kibanaとは

  • kibana(キバナ)はElasticsearchのデータを分析・可視化するツール
  • kibanaのDevtoolsを使うとElasticsearchのクエリを書くのが少し楽になる

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.12.4
  • Java : 1.8.0_121

Elasticsearch+Kibanaインストール

Homebrenwでもインストールできるし、

% brew install elasticsearch

ここからダウンロードしてもOKです。 ファイル解凍後に下記コマンド実行でElasticsearchが起動します。

% cd <path/your/es-dir>
% bin/elasticsearch

Elasticsearchが起動したら下記コマンドで動作確認しましょう。
デフォルトでは9200番ポートで起動します。
起動確認はcurlコマンドで↓のようにすればOKです。

% curl http://localhost:9200/
{
  "name" : "xxxxx",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "doVrO4p7TKycE72FSDS-LA",
  "version" : {
    "number" : "6.3.0",
    "build_hash" : "c58ff00",
    "build_date" : "2018-03-13T10:06:29.741383Z",
    "build_snapshot" : false
    ・・・
  },
  "tagline" : "You Know, for Search"
}

次にkibanaのセットアップをします。
ここからダウンロードして起動します。

% cd <path/your/kibana-dir>
% ./bin/kibana
・
・
log   [07:24:19.516] [info][listening] Server running at http://localhost:5601

デフォルトでは9200番ポートで起動しているESに接続し、5601番ポートで起動します。
\もしESが9200番ポート以外で起動している場合、
config/kibana.ymlを編集して適切なエンドポイントを指定しましょう。

kibanaが起動したら、ブラウザでkibanaのDevToolsを開きます。
http://localhost:5601/app/kibana#/dev_tools/console

このツールは左のペインにESへのリクエストを記述し、レスポンスが右のペインに表示されます。

用語

最低限知っておくべきES用語の説明を簡単に。

  • index データの保管場所で、RDBMSにおけるdatabaseに相当するものです。
    typeを定義するためのmappingを1つ以上持てる。

  • type index内に定義可能。RDBMSにおけるテーブルみたいなものです。

  • field データフィールド。RDBMSにおけるカラムです。

  • document データ本体。RDBMSにおけるレコードです。

  • mapping
    indexでdocumentをどのようなfiled/データ型で登録しておくのかを定義するのが mappingになります。
    デフォルトでは最初にdocumentを登録した際、自動でfieldの型が判断され、indexが作成されます。
    ※事前にindexのmapping情報を定義しておくことも可能

Elasticsearchのコマンドを実行してみる

kibanaのDev toolsを使って基本的なREST APIを実行してみましょう。
まずはデータの登録をしてみます。

# Dev Toolsのコンソール

PUT myes/book/b001
{
  "title" : "hello java",
  "description" : "java book",
  "author" : {
    "name":"taro",
    "age":30
  },
  "price": 1000
}

b001というIDで登録しています。
なお、POST myes/bookとして実行するとIDが自動で採番されます。

{
  "_index": "myes",
  "_type": "book",
  "_id": "b001",
  "_version": 1,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

デフォルトではデータ登録時に自動的にmappingされます。 
再度下記のようにPUTを実行すると、データの更新となります。

PUT myes/book/b001
{
  "title" : "hello java upate",
  "description" : "java book update",
  "author" : {
    "name":"taro",
    "age":30
  },
  "price": 2000
}

/<index名>/_mappingsとすればindexのmapping情報が取得できます。

GET myes/_mappings

登録したデータから自動的に型が決まっています。

{
  "myes": {
    "mappings": {
      "book": {
        "properties": {
          "author": {
            "properties": {
              "age": {
                "type": "long"
              },
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          },
          "description": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "price": {
            "type": "long"
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

また、_cat/indiciesを使うとindex一覧を表示できます。

GET /_cat/indices

HEADをつかえばdocumentの存在確認が可能です。
documetがあれば200、なければ404が返ってきます。

HEAD /myes/book/b001

DELETEメソッドをつかえばドキュメントの削除ができます。

DELETE myes/book/b002
{
  "_index": "myes",
  "_type": "book",
  "_id": "b002",
  "_version": 3,
  "result": "deleted",
 ・
 ・
}

ドキュメントの取得はGETメソッドでキーを指定することで行います。

GET myes/book/b001

また、最も使用するであろう検索はGETメソッドで検索条件を指定すれば可能です。

GET myes/book/_search 
{
  "query": {
    "term": {
      "title": "hello"
    }
  }
}
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "myes",
        "_type": "book",
        "_id": "b001",
        "_score": 0.2876821,
        "_source": {
          "title": "hello java",
          "description": "java book",
          "author": {
            "name": "taro",
            "age": 30
          },
          "price": 1000
        }
      }
    ]
  }
}

indexを自分で作成したい場合、PUTメソッドで mappingも指定しつつ定義可能です。

PUT static_index
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "type1" : {
            "properties" : {
                "field1" : { "type" : "text" }
            }
        }
    }
}

削除するときはDELETEメソッドで行います。

DELETE /static_index

まとめ

Elasticsearchを使えるようになるため、まずは簡単にさわってみることからはじめました。
これでひととおりドキュメントの作成から検索・削除までを試せます。