15.Elasticsearch更新文档1---全文更新---restAPI

时间:2022-11-21 20:09:20

在 Elasticsearch 中文档是 不可改变 的,不能修改它们。 相反,如果想要更新现有的文档,需要 重建索引 或者进行替换, 我们可以使用相同的 index API 进行实现。

1.新增一个文档

PUT /policy_document/policy_document/333
{
    "level":"国家",
    "plat_from":11,
    "reference_number":"333",
    "title":"省级文明单位颁发文件333号",
    "from_type":1,
    "id":"333",
    "_id_":"222",
    "launch_date":1485878400000,
    "launch_department":"国家科技局3"
}

2.我们使用相同的id,但是改变文档的部分内容,再次put一次

PUT /policy_document/policy_document/333
{
    "level":"国家",
    "plat_from":11,
    "reference_number":"333",
    "title":"省级文明单位颁发文件444号",
    "from_type":1,
    "id":"333",
    "_id_":"222",
    "launch_date":1485878400000,
    "launch_department":"国家科技局444"
}

返回内容为:

{
  "_index": "policy_document",
  "_type": "policy_document",
  "_id": "333",
  "_version": 2,
  "result": "updated",
  "_shards": { "total": 1, "successful": 1, "failed": 0 },
  "created": false }

可以看到返回的内容中,
created 标志设置成 false ,_version版本也发生了变化,是因为相同的索引、类型和 ID 的文档已经存在。
在内部,Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档。

3.使用id为222查询此文档

GET /policy_document/policy_document/333

查询后发现,现在的文档内容是新的那个:

{
  "_index": "policy_document",
  "_type": "policy_document",
  "_id": "333",
  "_version": 2,
  "found": true,
  "_source": { "level": "国家", "plat_from": 11, "reference_number": "333", "title": "省级文明单位颁发文件444号", "from_type": 1, "id": "333", "_id_": "222", "launch_date": 1485878400000, "launch_department": "国家科技局444" } }

4.而我们使用title或者其他字段去检索之前的那个文档,发现之前的文档已经无法检索到了

GET policy_document/policy_document/_search
{
  "query": {
    "match": {
      "title": "省级文明单位颁发文件333号"
    }
  }
}
{
  "took": 0,
  "timed_out": false,
  "_shards": { "total": 5, "successful": 5, "failed": 0 },
  "hits": { "total": 0, "max_score": null, "hits": [] } }

后面我们会介绍 update API, 这个 API 可以用于 partial updates to a document 。 虽然它似乎对文档直接进行了修改,但实际上 Elasticsearch 按前述完全相同方式执行以下过程:

  • 从旧文档构建 JSON
  • 更改该 JSON
  • 删除旧文档
  • 索引一个新文档

唯一的区别在于, update API 仅仅通过一个客户端请求来实现这些步骤,而不需要单独的 get 和 index 请求。