Mapping Exercise
Login into your sandbox
We have not yet configured elasticsearch service to start automatically, start using terminal window:
sudo service elasticsearch start
Service will start but listener will take its time before responding to incoming requests:
curl localhost:9200
Give it few minutes before you get json response
Post new document:
curl -XPOST localhost:9200/orders/orders/1 \ -H 'content-type: application/json' \ -d ' { "id": "1", "placedOn": "2016-10-17T13:03:30.830Z" }'
Fetch mapping:
curl 'localhost:9200/orders/orders/_mapping?pretty=true'
Expected response:
{ "orders" : { "mappings" : { "orders" : { "properties" : { "id" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "placedOn" : { "type" : "date" } } } } } }
Try modifying existing mapping:
curl -XPUT 'localhost:9200/orders/_mapping?pretty=true' \ -H 'content-type: application/json' \ -d ' { "orders" : { "mappings" : { "orders" : { "properties" : { "id" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "placedOn" : { "type" : "date", "format" : "strict_date_optional_time||epoch_millis" } } } } } }'
What's the outcome? And why?
Try modifying existing type mapping:
curl -XPUT 'localhost:9200/orders/orders/_mapping?pretty=mapping' \ -H 'content-type: application/json' \ -d '{ "orders" : { "mappings" : { "orders" : { "properties" : { "id" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "placedOn" : { "type" : "date", "format" : "strict_date_optional_time||epoch_millis" } } } } } }'
What now? Why?
Let us try again:
curl -XPUT 'localhost:9200/orders/orders/_mapping?pretty=mapping' \ -H 'content-type: application/json' \ -d ' { "orders" : { "properties" : { "id" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "placedOn" : { "type" : "date", "format" : "strict_date_optional_time||epoch_millis" } } } }'
Did it work? What's the difference?
Let's modify data type for existing field
curl -XPUT 'localhost:9200/orders/orders/_mapping?pretty=true' \ -H 'content-type: application/json' -d ' { "orders" : { "properties" : { "id" : { "type" : "double" }, "placedOn" : { "type" : "date", "format" : "strict_date_optional_time||epoch_millis" } } } }'
Seriously, what now? Why? So much for the dynamic data mapping?
What if we need to change data type after we have indexed the data?
There is no (more) option to delete the mapping - delete and recreate index is the only option :-(
curl -XDELETE localhost:9200/orders curl -XPUT localhost:9200/orders
User json data from the previous step to define the mapping
Watch out! There is no warning or confirmation using curl!
Psst: look out for the proper response too:
{ "acknowledged": true }
Last updated
Was this helpful?