1. 程式人生 > >Elasticsearch索引mapping的寫入、檢視與修改

Elasticsearch索引mapping的寫入、檢視與修改

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

,並設定mapping:

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修改過程,可以參考.