先ほど、RESTのPUT、POSTでデータを作成しました。
ElasticSearchはスキマーレスということもあり、スキーマを設定しなくとも、自動で設定してくれます。
その辺りの仕組みを少々記載します。
ElasticSearchはインデックスのドキュメントのスキーマを送られてきたJsonから推測します。
たとえば。
{
"field1":10,
"field2":"10"
}
とあった場合、field1は数値型、field2は文字列型と推定するわけです。
ちょっと登録してみます。
タイプ:testはすでにあるのでtest2で
curl -X POST http://192.168.33.10:9200/blog/test2/ -d '{"field1":10,"field2":"10"}'
Response
{
"_index" : "blog",
"_type" : "test2",
"_id" : "AU4BKkpR8Y0sBqrTHRLZ",
"_version" : 1,
"created" : true
}
では、index:blog, type:test2のスキーマを見てみます。
curl -x GET http://192.168.33.10:9200/blog/test2/_mapping?pretty
{
"blog" : {
"mappings" : {
"test2" : {
"properties" : {
"field1" : {
"type" : "long"
},
"field2" : {
"type" : "string"
}
}
},
"test" : {
"properties" : {
"title" : {
"type" : "string"
}
}
}
}
}
}
test,test2のスキーマが出力されます。
見てみればわかるように
field1:long
field2:string
になっています。
数値型は、longなので、ここに小数点を含んだ数値型をPOSTすると
小数点は切り捨てられます。
なので注意が必要。
自動はすごく便利なのですが、それでは実際に運用する場合に困ることも多いですな。
そんな時は、スキーマ(ElasticSearchではマッピングといいます)を指定してindexを作らないといけない。
また、文字列検索するときは検索するためにN-Gramやら形態素で解析できるフィールドにしないといけない。
次はその辺りを記載します。