更新文档有2中方式,索引 API
和_update API
。后者默认情况下,如果修改操作发现内容没有实质的变化,会拒绝处理该请求,version
不会递增,通过返回信息的result
属性标记noop
。
我们插入一条数据:
PUT twitter/_doc/1
{
"user" : "kimchy", //user名称是kimchy
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
插入操作的返回值,version属性值为1:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
ES提交修改
执行修改操作:
POST /twitter/_doc/1/_update/
{
"doc":{
"user":"kimchy2" //user名称是kimchy2,不是kimchy
}
}
使用默认参数修改的返回值,version
属性值递增为2:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 2, //version递增
"result": "updated", //显示执行了修改操作
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
ES拒绝提交修改
我们再执行一次名称为user=kimchy2
的修改操作,version
属性仍然是2,返回值中的result
为noop
:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 2, //version没有变化
"result": "noop", //标记为noop
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
}
}
ES提交修改
我们可以通过设置“detect_noop
”来禁用此行为:false
,改为强制提交修改操作,不管内容是否真的发生变化,如下所示:
POST twitter/_doc/1/_update
{
"doc" : {
"name" : "lisi"
},
"detect_noop": false //强制提交修改操作
}
我们再来看下执行结果:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 3, //version递增
"result": "updated", //显示执行了修改操作
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}