はじめに
この記事では前回の記事の続きとして、ElasticsearchにKibana Dev-ToolsとBashの2つの方法でMappingとデータ投入を行う方法を解説していきます。
参考
- Mapping
- Field data types
- Removal of mapping types
- はじめての Elasticsearch
- Elasticsearchからtypeが無くなる
- Elasticsearch 6 を利用する前に把握しておいた方がよさそうなこと
なぜこの記事を書いたのか
バイトでElasticsearchを扱う際にMappingや検索などの方法をググっても全然最新の記事が出てこず、世界に絶望しました
最新の情報が日本語として落ちてくるのは時間がかかる.....
そこで現在最新のElasticsearch7.9.1の操作を僕の知識の範囲で記事にして、少しでもElasticsearchを始める人の手助けになるべく記事を書いていこうと思います
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. CLIからの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"
}
② データ投入
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
}
③ 投入結果
データ投入の結果を確認する
コマンド
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"
}
}
]
}
}
コンソール画面
問題なく2つのデータが投入されているのが確認できる
7. まとめ
ここまでBashとDev-ToolsでのElasticsearchのMappingとデータ投入を解説しました
以外に簡単ですね
bash派だった僕も、この記事を書いている過程でDev-Toolsの素晴らしさに惹かれてしまいました....
Dev-Toolsが使える環境なら積極的に使ってみるのもいいかもしれないですね
次回はPythonでElasticsearchにMappingやデータ投入するのを記事にしようかなと思います