本文是在kibana提供的Devtool工具中测试

1、POST即能新增数据也能更新数据

笔者做了如下两组对比实验测试代码:

POST product_db/_doc
{
  "id": "888",
  "brandId": 777,
  "brandName": "vivo",
  "name": "vivo X6 pro",
  "price": "1999",
  "attrs": [
      {
          "attrId" : 1,
          "attrName" : "cpu",
          "attrValue" : "4核"
      },
      {
          "attrId" : 2,
          "attrName" : "颜色",
          "attrValue" : "白色"
      }
  ]
}

POST product_db/_doc/wzNfGnsBr_UJkvYDQFWh
{
  "id": "888",
  "brandId": 777,
  "brandName": "vivo",
  "name": "vivo X6 pro",
  "price": "1999",
  "attrs": [
      {
          "attrId" : 1,
          "attrName" : "cpu",
          "attrValue" : "4核"
      },
      {
          "attrId" : 2,
          "attrName" : "颜色",
          "attrValue" : "白色"
      }
  ]
}

执行上述两组指令,第一组未加文档id表明是新增,并返回了新增id,如下:

{
  "_index" : "product_db",
  "_type" : "_doc",
  "_id" : "wzNfGnsBr_UJkvYDQFWh",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 20,
  "_primary_term" : 2
}

第二组加上了文档id,同样执行成功,返回结果如下:

{
  "_index" : "product_db",
  "_type" : "_doc",
  "_id" : "wzNfGnsBr_UJkvYDQFWh",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 21,
  "_primary_term" : 2
}

由此可证明,POST即能新增数据也能更新数据

2、PUT也可以新增数据和更新数据

笔者同样做了如下两组对比实验测试代码:

PUT product_db/_doc/wTNNGnsBr_UJkvYDplXb/_create
{
  "id": "888",
  "brandId": 777,
  "brandName": "vivo",
  "name": "vivo X6 pro",
  "price": "1999",
  "attrs": [
      {
          "attrId" : 1,
          "attrName" : "cpu",
          "attrValue" : "4核"
      },
      {
          "attrId" : 2,
          "attrName" : "颜色",
          "attrValue" : "白色"
      }
  ]
}

PUT product_db/_doc/wTNNGnsBr_UJkvYDplXb
{
  "id": "888",
  "brandId": 777,
  "brandName": "vivo",
  "name": "vivo X6 pro",
  "price": "1999",
  "attrs": [
      {
          "attrId" : 1,
          "attrName" : "cpu",
          "attrValue" : "4核"
      },
      {
          "attrId" : 2,
          "attrName" : "颜色",
          "attrValue" : "白色"
      }
  ]
}

执行上述两组指令,第一组添加了/_create,结果如下:

{
  "_index" : "product_db",
  "_type" : "_doc",
  "_id" : "eTNNGn_sBYDplXb",
  "_version" : 5,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 18,
  "_primary_term" : 2
}

第二组去除了尾部的/_create,同样执行成功,结果如下:

{
  "_index" : "product_db",
  "_type" : "_doc",
  "_id" : "wTNNGnsBr_UJkvYDplXb",
  "_version" : 4,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 19,
  "_primary_term" : 2
}

由上述结果可证明put同样有新增和更新的功能

3、结论

共同点:

  • ES中的put和post同样都具备创建和更新的功能;

不同点:

  • put需要精确到某一个资源文件,这样才能进行对数据的更新和创建操作;
  • post能对整个资源集合进行操作,如果没有指定具体修改的文件id,那么post指令会自动生成一个唯一的id进行文件的创建,并将数据写入该文件中。如果指定了文件id,那么就会根据填写的参数对数据进行创建和更新操作;
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐