document操作CURD
6 文档基本操作
6.1 新建文档
使用kibana工具对文档操作:
PUT blog_zyc/_doc/1
{
"title":"第一条操作记录",
"date":"2021-11-11",
"content":"莫买沃洲山的下一句 莫买沃洲山,时人已知处 出自 《送上人》 作者 :刘长卿 莫买沃洲山全文 孤云将野鹤,岂向人间住? 莫买沃洲山,时人已知处。"
}
1表示文档的id
添加成功后,响应的 json 如下:
{
"_index" : "blog_zyc",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 3,
"successful" : 3,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- _index 表示文档索引。
- _type 表示文档的类型。
- _id 表示文档的 id。
- _version 表示文档的版本(更新文档,版本会自动加 1,针对一个文档的)。
- result 表示执行结果。
- _shards 表示分片信息。
- _seq_no 和 _primary_term 这两个也是版本控制用的(针对当前 index)。
添加文档时,也可以不指定 id,此时系统会默认给出一个 id,如果不指定 id,则需要使用 POST 请求,而不能使用 PUT 请求。
POST blog_zyc/_doc
{
"title":"第二条操作记录",
"date":"2021-11-11",
"content":"众鸟高飞尽下一句 众鸟高飞尽,孤云独去闲。 出自 《独坐敬亭山》 作者 :李白 众鸟高飞尽全文 众鸟高飞尽,孤云独去闲。 相看两不厌,只有敬亭山。"
}
6.2 获取文档
Es 中提供了 GET API 来查看存储在 es 中的文档。index/_doc/id 使用方式如下:
GET blog_zyc/_doc/BCjVCH0BFkQ4ZgwDY0kE
{
"_index" : "blog_zyc",
"_type" : "_doc",
"_id" : "BCjVCH0BFkQ4ZgwDY0kE",
"_version" : 1,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "第二条操作记录",
"date" : "2021-11-11",
"content" : "众鸟高飞尽下一句 众鸟高飞尽,孤云独去闲。 出自 《独坐敬亭山》 作者 :李白 众鸟高飞尽全文 众鸟高飞尽,孤云独去闲。 相看两不厌,只有敬亭山。"
}
}
如果获取不存在的文档,会返回如下信息:
{
"_index" : "blog_zyc",
"_type" : "_doc",
"_id" : "BCjVCH0BFkQ4ZgwDY0kEs",
"found" : false
}
如果仅仅只是想探测某一个文档是否存在,可以使用 head 请求:
HEAD blog_zyc/_doc/231
批量获取文档:
GET blog_zyc/_mget
{
"ids":["1","BCjVCH0BFkQ4ZgwDY0kE"]
}
数据返回:
{
"docs" : [
{
"_index" : "blog_zyc",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "第一条操作记录",
"date" : "2021-11-11",
"content" : "莫买沃洲山的下一句 莫买沃洲山,时人已知处 出自 《送上人》 作者 :刘长卿 莫买沃洲山全文 孤云将野鹤,岂向人间住? 莫买沃洲山,时人已知处。"
}
},
{
"_index" : "blog_zyc",
"_type" : "_doc",
"_id" : "BCjVCH0BFkQ4ZgwDY0kE",
"_version" : 1,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "第二条操作记录",
"date" : "2021-11-11",
"content" : "众鸟高飞尽下一句 众鸟高飞尽,孤云独去闲。 出自 《独坐敬亭山》 作者 :李白 众鸟高飞尽全文 众鸟高飞尽,孤云独去闲。 相看两不厌,只有敬亭山。"
}
}
]
}
这里可能有小伙伴有疑问,GET 请求竟然可以携带请求体?某些特定的语言,例如 JavaScript 的 HTTP 请求库是不允许 GET 请求有请求体的,实际上在 RFC7231 文档中,并没有规定 GET 请求的请求体该如何处理,这样造成了一定程度的混乱,有的 HTTP 服务器支持 GET 请求携带请求体,有的 HTTP 服务器则不支持。虽然 es 工程师倾向于使用 GET 做查询,但是为了保证兼容性,es 同时也支持使用 POST 查询。例如上面的批量查询案例,也可以使用 POST 请求。
6.3 更新文档
6.3.1 普通更新
文档更新一次,version 就会自增 1
PUT test2/_doc/111
{
"title": "我在更新第一个文档666"
}
大多数时候,我们只是想更新文档字段,这个可以通过脚本来实现。
POST test2/_update/0SiHCH0BFkQ4ZgwDPRbS
{
"script": {
"lang": "painless",
"source":"ctx._source.title=params.title",
"params": {
"title":"666666在test2中我是第二个文档,已经修改过了"
}
}
}
更新的请求格式:POST {index}/_update/{id}
在脚本中,lang 表示脚本语言,painless 是 es 内置的一种脚本语言。source 表示具体执行的脚本,ctx 是一个上下文对象,通过 ctx 可以访问到 _source、_title 等。
也可以向文档中添加字段:
POST test2/_update/0SiHCH0BFkQ4ZgwDPRbS
{
"script": {
"lang": "painless",
"source":"ctx._source.tags=[\"java\",\"php\"]"
}
}
通过脚本语言,也可以修改数组。例如再tags中添加一个数据:
POST test2/_update/0SiHCH0BFkQ4ZgwDPRbS
{
"script":{
"lang": "painless",
"source":"ctx._source.tags.add(\"js\")"
}
}
6.3.2 查询更新
将 title 中包含 666 的文档的 content 修改为 888。
POST test2/_doc/qyqyC30BFkQ4ZgwDGT69
{
"script": {
"source": "ctx._source.content=\"888\"",
"lang": "painless"
},
"query": {
"term": {
"title":"666"
}
}
}
6.4 删除文档
6.4.1 通过id删除
从索引中删除一个文档,最常用的也是通过id删除
删除一个id为 0SiHCH0BFkQ4ZgwDPRbS
文档
DELETE test2/_doc/111
如果在添加文档时指定了路由,则删除文档时也需要指定路由,否则删除失败。
6.4.2 查询删除
查询删除是 POST 请求。
POST test2/_delete_by_query
{
"query":{
"term":{
"title":"备用1"
}
}
}
删除一个索引下的所有文档:
POST test2/_delete_by_query
{
"query":{
"match_all":{
}
}
}
6.5 批量操作
es 中通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。首先需要将所有的批量操作写入一个 JSON 文件中,然后通过 POST 请求将该 JSON 文件上传并执行。
创建一个json文件:
{
"index": {
"_index": "user",
"_id": "666"
}
}
{
"name": "datazyc"
}
{
"update": {
"_index": "user",
"_id": "666"
}
}
{
"doc": {
"name": "增强datazyc"
}
}
curl -XPOST "http://localhost:9200/user/_bulk" -H "content-type:application/json" --data-binary @test.json