当前使用的版本为 7.2
索引一个文档
文档通过 _index
、_type
、_id
唯一确定,_id
可以自己指定,也可以自动生成。
自己指定id:
curl -X PUT "localhost:9200/website/blog/123?pretty" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
'
自增ID:
curl -X POST "localhost:9200/website/blog?pretty" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
'
没有指定ID时需要使用 POST
获取文档
查询所有文档,验证上面的添加结果:
curl -X GET "localhost:9200/website/blog/_search?pretty"
查看某个文档:
curl -X GET "localhost:9200/website/blog/123?pretty"
pretty
会让es美化输出,以格式化JSON结构显示结果,便于阅读,但_source
部分不会被美化,与输入时的形式一致。
默认返回文档的所有字段,可以指定只返回自己感兴趣的部分:
curl -X GET "localhost:9200/website/blog/123?_source=title,text&pretty"
返回结果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"text" : "Just trying this out...",
"title" : "My first blog entry"
}
}
也可以只看_source
部分:
curl -X GET "localhost:9200/website/blog/123/_source?pretty"
检查文档是否存在
curl -i -X HEAD "localhost:9200/website/_doc/123"
如果存在,返回:
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 219
如果不存在,会返回 404
。
更新文档
ES中文档是不可变的,如果需要更新已经存在的文档,需要重建索引,或者替换它。
curl -X PUT "localhost:9200/website/blog/123?pretty" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2019/01/01"
}
'
返回结果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 2,
"result" : "updated",
...
}
可以看到_version
增加了,result
为已更新。
ES会把旧文档标记为”删除“,并添加一个完整的新文档。旧文档不会立即消失,但也不能访问,会在数据增加时进行清理。
对于文档局部更新,过程也一样:
- 从旧文档中检索JSON
- 修改内容
- 删除旧文档
- 索引新文档
删除文档
curl -X DELETE "localhost:9200/website/blog/123?pretty"
返回结果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 3,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
可以看到_version
增加了。
如果文档不存在,会返回not_found
:
curl -X DELETE "localhost:9200/website/blog/123456?pretty"
# 返回结果
{
"_index" : "website",
"_type" : "blog",
"_id" : "123456",
"_version" : 1,
"result" : "not_found",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 5,
"_primary_term" : 1
}
并发控制
如果多个请求同时修改文档,会有并发问题,es中的文档有版本号的概念,可以通过版本号实现乐观锁机制。
在 7.0 之前可以使用
_version
版本号,在之后,需要使用_seq_no
顺序号。
创建一个新的文档:
curl -X PUT "localhost:9200/website/blog/10/_create?pretty" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "just trying this out..."
}
'
返回结果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "10",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 7,
"_primary_term" : 1
}
查看文档:
curl -X GET "localhost:9200/website/blog/10?pretty"
返回文档:
{
"_index" : "website",
"_type" : "blog",
"_id" : "10",
"_version" : 1,
"_seq_no" : 7,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "My first blog entry",
"text" : "just trying this out..."
}
}
需要关注 _seq_no
和 _primary_term
,现在修改文档,并指定这两项:
curl -X PUT "localhost:9200/website/blog/10?if_seq_no=7&if_primary_term=1&pretty" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "update ..."
}
'
返回结果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "10",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 8,
"_primary_term" : 1
}
"result" : "updated"
更新成功,_version
与 _seq_no
都增加了。
如果指定的顺序号与当前文档不符,则会报错,例如再执行一遍上面的修改,会报错:
...
{
"error" : {
"root_cause" : [
{
"type" : "version_conflict_engine_exception",
"reason" : "[10]: version conflict, required seqNo [7], primary term [1]. current document has seqNo [8] and primary term [1]",
...
}
],
...
},
"status" : 409
}
网友评论