Elasticsearchのdate型でInvalid format言われた場合の対処方法
こんな感じのマッピングを作成して、 accesstime に 2018/08/16 19:00:00 のような日時を入れたら Invalid format 言われた場合 format を指定したら解決
elasticsearch的にこの方法がいいのかは検討する必要あるけど、とりあえず今はこれでOK
修正前
curl -XPUT "http://172.17.0.2:9200/my_index" -H 'Content-Type: application/json' -d'
{
"mappings": {
"my_type": {
"properties" : {
"host": {"type":"keyword"},
"method": {"type":"keyword"},
"accesstime": {"type": "date"}
}
}
}
}'
修正後
curl -XPUT "http://172.17.0.2:9200/my_index" -H 'Content-Type: application/json' -d'
{
"mappings": {
"my_type": {
"properties" : {
"host": {"type":"keyword"},
"method": {"type":"keyword"},
"accesstime": {
"type": "date",
"format": "yyyy/MM/dd HH:mm:ss"
}
}
}
}
}'
kibanaを起動する(Docker)
今回はkibanaを起動してみます。
kibanaも基本的には公式を参考とすれば問題ありません。
Elasticsearchの起動はこちらをどうぞ
Dockerイメージを取得
docker pull docker.elastic.co/kibana/kibana:6.3.2
イメージ名を変更する
前回同様、イメージ名が長すぎて使いづらいのでイメージ名を変更します。
docker tag {取得したイメージID} kibana:6.3.2
# 変更前は削除
docker rmi docker.elastic.co/kibana/kibana:6.3.2
起動
kibanaを起動します。
ELASTICSEARCH_URL にはElasticsearchのURLを指定します。
※Elasticsearchの起動時に名前を指定しておいた方がよさそうですね
docker run -p 5601:5601 -e "ELASTICSEARCH_URL=http://IPアドレス:9200" kibana:6.3.2
アクセス
kibanaにアクセスします。
IPアドレスにはdockerホストのアドレスを指定します。
http://IPアドレス:5601
こんな画面が出ればOK!

とりあえずここまで!
PHPStormでファイル名検索ができなくなったらすること
たまーにPHPStromでファイル名検索しようとすると検索候補として何も表示されない(ログとか一部なぜか表示される)状況に悩まされていたけど解決したので残しておきます。
メニューから以下を実行
[ファイル]-[キャッシュの破棄/再起動]-[破棄して再起動]
※日本語化してあります
再起動後通常通り検索できるはず!
Elasticsearchドキュメント操作の基本
ドキュメントの登録
PUT
IDを指定して登録します。
IDに使える文字は半角英数っぽい
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/ID
例)
curl -XPUT http://localhost:9200/my_index/my_type/1 \
-H 'Content-Type: application/json' -d'
{
"name": "kozo",
"address": "japan",
"message": "hello world"
}
'
POST
IDはランダムな英数で自動採番される。
他にPUTとの違いがあるのかな?
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/
例)
curl -XPOST http://localhost:9200/my_index/my_type \
-H 'Content-Type: application/json' -d'
{
"name": "kozo",
"address": "japan",
"message": "hello world"
}
'
ドキュメントの取得
ID指定での取得方法です。
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/ID
例)
curl -XGET http://localhost:9200/my_index/my_type/1 curl -XGET http://localhost:9200/my_index/my_type/1?pretty curl -XGET http://localhost:9200/my_index/my_type/1/_source?pretty
?prettyを指定することでレスポンスを見やすくフォーマットしてくれます_sourceを指定すると登録内容のみが取得できます
ドキュメントの検索
とりあえず完全一致
APII形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/_search
例)
curl -XGET http://localhost:9200/my_index/my_type/_search?pretty -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"name": "kozo"
}
}
}'
検索範囲
# my_typeの中から検索 http://localhost:9200/my_index/my_type/_search?pretty # my_indexの中から検索 http://localhost:9200/my_index/_search?pretty # 複数indexの中から検索 http://localhost:9200/my_index,my_index2/_search?pretty # ワイルドカード指定 http://localhost:9200/my_index*/_search?pretty # 全体から検索 http://localhost:9200/_search?pretty
ドキュメントの全体更新
PUTでドキュメントの全体を更新します
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/ID
例)
curl -XPUT http://localhost:9200/my_index/my_type/1 \
-H 'Content-Type: application/json' -d'
{
{
"name": "kozo",
"address": "japan",
"message": "hello world"
}
}
'
ドキュメントの一部更新
更新だけど、 POST を発行するみたい。
内部的には削除 => 再登録なのかな?
doc を指定して送信します
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/ID/_update
例)
curl -XPOST 'http://192.168.10.11:9200/my_index/my_type/1/_update?pretty' -H 'Content-Type: application/json' -d'
{
"doc": {
"user_name": "kozo(update test)"
}
}
'
ドキュメントの削除
ID指定で削除する
API形式
http://ホスト:9200/インデックス名/ドキュメントタイプ名/ID
例)
curl -XDELETE http://192.168.10.11:9200/my_index/my_type/1?pretty
インデックスの作成
インデクスを作成せずにドキュメントの登録を行うとElasticsearchが自動的にインデックスを作成している。
インデックスを明示的に作成する必要があるタイミングは以下ののような デフォルト値 でインデックスを作成したくない場合となる
- レプリカ数を変更したい場合
- シャード数を変更したい場合(特にシャード数はインデックス作成時のみにしか変更することは出来ない)
API形式
http://ホスト:9200/インデックス名
例)
curl -XPUT "http://192.168.10.11:9200/my_index3" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}'
例2) すべてを書略した場合
curl -XPUT "http://192.168.10.11:9200/my_index3"
インデックスの設定情報取得
API形式
http://ホスト:9200/インデックス名/_settings
例)
curl -XGET "http://192.168.10.11:9200/my_index3/_settings?pretty"
インデックス設定の更新
API形式
http://ホスト:9200/インデックス名/_settings
例)
curl -XPUT "http://192.168.10.11:9200/my_index3/_settings" -H 'Content-Type: application/json' -d'
{
"index": {
"number_of_replicas": 3
}
}'
インデックスの削除
API形式
http://ホスト:9200/インデックス名
例)
curl -XDELETE "http://192.168.10.11:9200/my_index3"
Elasticsearchの用語
自分の備忘録的に書いておきます
徐々に増やす予定
インデックス
RDBでの DB に相当する。
ドキュメントタイプ
RDBでの テーブル に相当する
ドキュメントタイプの中に含まれるフィールドのデータ構造やデータ型を記述したものを マッピング と呼ぶ
ドキュメント
RBDでの 1レコード に相当する。
一般的なRDBとの違いは JSONオブジェクトを保存するところである。
IDはインデックスへのドキュメントを格納するタイミングで自動採番される。
フィールド
RDBでの カラム に相当する。
ElasticsearchのドキュメントはJSONになっているので、 フィールドは JSONの「キー:バリュー」の一組になる。
基本的にはフィールド単位ので検索となる。
型としては、 text, long, short, integer, float, date, boolean など基本的にそろっている
Node
サーバーとイコール?
Shard
1つのインデックスは複数のShardから構成されている?
Shardを増やすと基本的には性能があがる?
デフォルト値とことなるShard数を持つIndexを作成したい場合は明示的に作成する
Replica
Shardとの違いがあまり分かってない。
Elasticsearchの起動 (Docker)
Elasticsearchを今まで使ってこなかったのですが、必要に迫られて使うことに。
新しくて・基礎から丁寧に説明してある、いい書籍があったのでこれを読みながら頑張ってみます。

Elasticsearch実践ガイド impress top gearシリーズ
- 作者: 惣道哲也
- 出版社/メーカー: インプレス
- 発売日: 2018/06/15
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
とりあえず起動
Dockerにimageがあったので起動してみようと思ったのですが3つimageが存在するようです。
- https://hub.docker.com/_/elasticsearch/
- https://hub.docker.com/r/elastic/elasticsearch/
- https://www.docker.elastic.co/
一番上に Official Repository と書いてあったのでこれを使っていたのですがどうやら違うようです。
Descriptionに DEPRECATION NOTICE 書いてあった。。。。
ちゃんと英語読まなきゃね。。。
2つ目、3つ目は同じようですが、 3つめが公式サイトになるので、今回は3つ目を使用します。
実践ガイドの書籍も3つ目を使用しています。
こんどこそ起動
基本的には、公式に丁寧に書いてあります。
イメージを取ってきます
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.1
イメージ名を変更する
公式サイトでは名前の変更をしてないので変更する必要はないのですが、このままだとイメージ名が長いので elasticsearch:6.3.1 に変更しちゃいます。
docker tag {取得したイメージID} elasticsearch:6.3.1
# 変更前は削除
docker rmi docker.elastic.co/elasticsearch/elasticsearch:6.3.1
起動
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.3.1
動作確認
curl http://192.168.10.11:9200/_cat/health # こんな値が帰ってくればOK! > 1532148126 04:42:06 docker-cluster green 1 1 0 0 0 0 0 0 - 100.0%
これでとりあえず実行環境はそろいました。
WSL上でDockerが動いた!けどまだつらい?
ネットでWSL上でDockerが動くようになってたと見かけたのでTryしてみました。
結果はまだつらそうかな?
WSLのインストール + Ubuntuのインストール
ネットで調べたらいっぱい出てくるのでそちらで
注意点
- Ubuntu自体を管理者で実行する(右クリック => 管理者として実行)
Dockerのインストール
これでインストール + 起動が出来たのですが、Docker CEでは動作しませんでした。
インストールされるバージョンも Docker version 1.13.1, build 092cba3 とちょっと古めです。
sudo apt update sudo apt upgrade # docker.ioを利用する sudo apt install docker.io sudo cgroupfs-mount sudo usermod -aG docker $USER sudo service docker start
hello-world
docker run hello-world

Apacheを動かしてみる
これも普通に動作します
docker run -p 8080:80 --name apache httpd:2.4.33-alpine
コンテナに入りたい。。。
コンテナにエラーが出て入れませんでした。
解決策あるのかな。。。
docker exec apache /bin/bash
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"could not create session key: function not implemented\"\n"
まだ難しい?
安定運用可能になるまでには、もう少し時間がかかりそう?
普通に使えるようになると便利そうなんだけどな。。。