LoginSignup
8
5

More than 3 years have passed since last update.

Elasticsearch(7.9.1)にデータ投入

Last updated at Posted at 2020-09-16

512px-Elasticsearch_logo.svg (3).png

はじめに

この記事では前回の記事の続きとして、ElasticsearchにKibana Dev-ToolsとBashの2つの方法でMappingとデータ投入を行う方法を解説していきます。

参考

なぜこの記事を書いたのか

バイトでElasticsearchを扱う際にMappingや検索などの方法をググっても全然最新の記事が出てこず、世界に絶望しました
pose_zasetsu.png
最新の情報が日本語として落ちてくるのは時間がかかる.....
そこで現在最新のElasticsearch7.9.1の操作を僕の知識の範囲で記事にして、少しでもElasticsearchを始める人の手助けになるべく記事を書いていこうと思います

目次

  • 1. 概要
  • 2. 環境
  • 3. Elasticsearch6.0,7.0以降の注意点
  • 4. Fieldのデータ型
  • 5. BashからのMapping~データ投入
  • 6. Kibana Dev-ToolsからのMapping~データ投入
  • 7. まとめ
  • 8. 次回

1. 概要

今回はDev-ToolsとBashの両方からElasticsearchにMappingを行う方法をまとめていますが、ほとんどクエリの内容に違いはありません
個人的には、Dev-Toolsはいちいちブラウザを立ち上げなくちゃいけないのでBashから操作するほうが楽で好きです。

2. 環境

  • Ubuntu 20.04
  • Elasticsearch 7.9.1
  • Kibana 7.9.1

3. Elasticsearch6.0,7.0以降の注意点

ElasticSearch6.0以降(この記事で扱っている7.9.1も同様)は、クエリやMappingに一部の大きな変更があります
その中でMappingに関係がある点を取り上げます

①Content-Typeヘッダの指定

ElasticSearch5.xまではこのContent-Typeを指定しなくても良かったのですが、6.x以降よりこの指定が必須となりました

curl -H "Content-Type: application/json" -XPUT "http//127.0.0.1:9200/my_index?pretty"

②Type指定はしなくていい

Elasticsearch7.0からタイプレスAPIへと移行し、Mapping時にタイプの指定が必要なくなりました
この詳しい理由はこの記事を参考ください
要約すると、一つのインデックスに共通要素の少ないtypeが混在していると、Elasticsearc内部でLucenceのドキュメント圧縮が効率良く行えないから

#~7.0
{
  "mappings": {
    "user" : { #<-7.0まではここにTypeを入れられた
      "properties": {
        "username": {
          "type": "keyword"
        }
      }
    }
  }
}
#7.0~
{
  "mappings": {
    "properties": {
      "username": {
        "type": "keyword"
      }
    }
  }
}

③Field TypeにStringが使えなくなった

Elastisearch6.0では文字列フィールドにStringが使用できなくなり、代わりにtextかkeywordを使うように変更された

4. Fieldのデータ型

次に、Mappingの前にElasticsearchで使用できるFieldのデータ型を紹介します
これらが全てではないです。公式ドキュメントに全部載っています。

典型的なデータ型

keyword 名前やIDなどの単語
long 64bitの符号付き整数
double 倍精度64bit IEEE754
浮動小数点数
boolean ブール値。trueかfalseの2値
date yyyy-MM-dd(これ以外の形式も使える)

構造化データ型

long_range,date_range,
ip_range
数値や日付、IPアドレスの範囲
ip IPv4かIPv6のIPアドレス

テキスト検索のデータ型

text Analyzedされた非構造化テキスト
全文検索で使う

特殊なデータ型

histogram 度数と階級で扱う。詳しくはここ
geo_point 緯度と経度のペアで扱う。地理的な特徴や中心地からの距離で集計される

5. BashからのMapping~データ投入

さて、前置きが長くなりましたがいよいよMappingについて説明していきます

①Indexの作成


curl -H "Content-Type: application/json" -X PUT "http://127.0.0.1:9200/test_index1?pretty" -d '
     {
       "mappings" : {
         "properties" : {
           "hoge" : {"type" : "text"},
           "huga" : {"type" : "long"},
           "time" : {"type" : "date"}
         }
       }
     }'
作成結果
$  curl -H "Content-Type: application/json" -X GET "http://127.0.0.1:9200/test_index1?pretty"
{
  "test_index1" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "hoge" : {
          "type" : "text"
        },
        "huga" : {
          "type" : "long"
        },
        "time" : {
          "type" : "date"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1600221292751",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "GHl3ZSAlTSu5ayA_8MHPcg",
        "version" : {
          "created" : "7090199"
        },
        "provided_name" : "test_index1"
      }
    }
  }
}

②データ登録

データを投入します
投入は以下のようにやります


$ curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/test_index2/_doc/data1?pretty' -d '
     {
       "hoge" : "hogehoge",
       "huga" : "2020",
       "time" : "2020-09-16"
     }'
$ curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/test_index2/_doc/data2?pretty' -d '
     {
       "hoge" : "hogehuga",
       "huga" : 2021,
       "time" : "2021-09-16"
     }'
投入結果
$ curl -H "Content-Type: application/json" -X GET "http://127.0.0.1:9200/test_index2/_search?pretty"
{
  "took" : 712,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_index2",
        "_type" : "_doc",
        "_id" : "data1",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehoge",
          "huga" : 2020,
          "time" : "2020-09-16"
        }
      },
      {
        "_index" : "test_index2",
        "_type" : "_doc",
        "_id" : "data2",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehuga",
          "huga" : 2021,
          "time" : "2021-09-16"
        }
      }
    ]
  }

ちゃんとデータ投入されてるのが確認ますね

つぎはKibanaからMapping~データ投入の手順を紹介していきたいと思います

6. KibanaからMapping~データ投入

ほとんど変わりませんが、クエリはbashより簡単になってます

①Mapping

PUT test_kibana
 {
   "mappings" : {
     "properties" : {
       "hoge" : {"type" : "text"},
       "huga" : {"type" : "long"},
       "time" : {"type" : "date"}
     }
   }
 }'

Mapping結果
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test_kibana"
}

Dev-Toolsのコンソールはこんな感じ
コメント 2020-09-16 123338.png
コメント 2020-09-16 1223338.png

②データ投入

PUT test_kibana/_doc/data1
 {
    "hoge" : "hogehoge",
    "huga" : 2020,
    "time" : "2020-09-16"
 }
PUT test_kibana/_doc/data2
 {
    "hoge" : "hogehuga",
    "huga" : 2021,
    "time" : "2022-09-16"
 }
# PUT test_kibana/_doc/data1
{
  "_index" : "test_kibana",
  "_type" : "_doc",
  "_id" : "data1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

# PUT test_kibana/_doc/data2
{
  "_index" : "test_kibana",
  "_type" : "_doc",
  "_id" : "data2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

コンソール画面
コメント 2020-09-16 123738.png
コメント 2020-09-16 1223738.png

③投入結果

データ投入の結果を確認する

コマンド
GET test_kibana/_search
実行結果
{
  "took" : 192,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_kibana",
        "_type" : "_doc",
        "_id" : "data1",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehoge",
          "huga" : 2020,
          "time" : "2020-09-16"
        }
      },
      {
        "_index" : "test_kibana",
        "_type" : "_doc",
        "_id" : "data2",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehuga",
          "huga" : 2021,
          "time" : "2022-09-16"
        }
      }
    ]
  }
}

コンソール画面
コメント 2020-09-16 12232738.png
コメント 2020-09-16 1223233738.png
問題なく2つのデータが投入されているのが確認できる

7. まとめ

ここまでBashとDev-ToolsでのElasticsearchのMappingとデータ投入を解説しました
以外に簡単ですね:flushed:
bash派だった僕も、この記事を書いている過程でDev-Toolsの素晴らしさに惹かれてしまいました....
Dev-Toolsが使える環境なら積極的に使ってみるのもいいかもしれないですね

8. 次回

次回はPythonでElasticsearchにMappingやデータ投入するのを記事にしようかなと思います

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5