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

posted on 2021-11-15 14:36  --工具人  阅读(43)  评论(0编辑  收藏  举报