Elastic Search创建文档和更新文档(Put && Update)
在平时的es中需要对文档创建或者更新,通常情况下有2种api实现,举例如下:
第1种:PUT /testindex/testtype/id
第2种:post /testindex/testtype/id/_update (partial update)
第1种 是首先是创建,再次执行就是更新,如下:
创建一个 索引为testindex,类型为testtype,文档id为10的数据
PUT /testindex/testtype/10
{
"textField1":"This is aaaaa",
"textField2":"This is bbbbb"
}
然后我需要对textField1进行修改,如果单单对一个字段进行修改,必须要将第2个字段一起写上,否则将会丢掉第2个字段,正确修改如下:
PUT /testindex/testtype/10
{
"textField1":"This is bbbbb-update",
"textField2":"This is bbbbb"
}
如果使用第2种的话,只需针对某一个字段进行修改就可以了
POST /testindex/testtype/10/_update
{
"doc":{
"textField1":"This is bbbbb-update"
}
}
partial update相较于第一种全量替换其实是一样的,都是首先内部获取document然后将传过来的field更新到document的json中,将老的document标记为deleted,最后修改后的document创建出来,所以version会变。
只是他优点在于,所有的查询,修改和写回操作,都发生在es中的一个shard内部,避免了所有的网络数据传输的开销(减少2次网络请求),大大的提升了性能,并减少并发的情况。如果说同时几个操作执行第一种api时,有可能一个还没更新完,会被后一个替代掉某个字段的值.