Elasticsearch索引mapping的寫入、檢視與修改
阿新 • • 發佈:2018-12-26
mapping的寫入與檢視
首先建立一個索引:
curl -XPOST "http://127.0.0.1:9200/productindex"
{"acknowledged":true}
現在只建立了一個索引,並沒有設定mapping,檢視一下索引mapping的內容:
curl -XGET "http://127.0.0.1:9200/productindex/_mapping?pretty"
{
"productindex" : {
"mappings" : { }
}
}
可以看到mapping為空,我們只建立了一個索引,並沒有進行mapping配置,mapping自然為空。
下面給productindex這個索引加一個type,type name為product
curl -XPOST "http://127.0.0.1:9200/productindex/product/_mapping?pretty" -d ' { "product": { "properties": { "title": { "type": "string", "store": "yes" }, "description": { "type": "string", "index": "not_analyzed" }, "price": { "type": "double" }, "onSale": { "type": "boolean" }, "type": { "type": "integer" }, "createDate": { "type": "date" } } } } ' { "acknowledged" : true }
上面的操作中,我們給productindex加了一個type,並寫入了product的mapping資訊,再次檢視:
curl -XGET "http://127.0.0.1:9200/productindex/_mapping?pretty" { "productindex" : { "mappings" : { "product" : { "properties" : { "createDate" : { "type" : "date", "format" : "strict_date_optional_time||epoch_millis" }, "description" : { "type" : "string", "index" : "not_analyzed" }, "onSale" : { "type" : "boolean" }, "price" : { "type" : "double" }, "title" : { "type" : "string", "store" : true }, "type" : { "type" : "integer" } } } } } }
修改mapping
如果想給product新增一個欄位,那麼需要修改mapping,嘗試一下:
curl -XPOST "http://127.0.0.1:9200/productindex/product/_mapping?pretty" -d '{
"product": {
"properties": {
"amount":{
"type":"integer"
}
}
}
}'
{
"acknowledged" : true
}
新增成功。
如果要修改一個欄位的型別呢,比如onSale欄位的型別為boolean,現在想要修改為string型別,嘗試一下:
curl -XPOST "http://127.0.0.1:9200/productindex/product/_mapping?pretty" -d '{
"product": {
"properties": {
"onSale":{
"type":"string"
}
}
}
}'
返回錯誤:
{
"error" : {
"root_cause" : [ {
"type" : "illegal_argument_exception",
"reason" : "mapper [onSale] of different type, current_type [boolean], merged_type [string]"
} ],
"type" : "illegal_argument_exception",
"reason" : "mapper [onSale] of different type, current_type [boolean], merged_type [string]"
},
"status" : 400
}
為什麼不能修改一個欄位的type?原因是一個欄位的型別修改以後,那麼該欄位的所有資料都需要重新索引。Elasticsearch底層使用的是lucene庫,欄位型別修改以後索引和搜尋要涉及分詞方式等操作,不允許修改型別在我看來是符合lucene機制的。
這裡有一篇關於修改mapping欄位的部落格,敘述的比較清楚:Elasticsearch 的坑爹事——記錄一次mapping field修改過程,可以參考.