Elasticsearch 7 添加和更新文档

Elasticsearch 7 : 添加和更新文档

目录:
使用 POST
添加数据示例1:
添加数据示例2:
一个错误的更新数据方式
使用 _update 更新文档
使用 _update_by_query 更新文档

在 ES 7 中新增索引:
PUT student
{
  "mappings" : {
    "properties" : {
      "name" : {
        "type" : "keyword"
      },
      "age" : {
        "type" : "integer"
      }
    }
  },
  "settings" : {
    "index" : {
      "number_of_shards" : 1,
      "number_of_replicas" : 0
    }
  }
}

使用 POST
POST 用于更新数据,如果不存在,则会创建。
添加数据示例1:
# 请求
POST student/_doc
{
  "name": "张三"
}
# 响应
{
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "gCJ8Tm4Buf-uwlbZzC7C",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

添加数据示例2:
指定 _id 为 2。

请求

POST student/_doc/2
{
  "name": "李四"
}

响应

{
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

一个错误的更新数据方式

请求

GET student/_doc/2

响应

{
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "李四"
  }
}
可以看到没有 age 字段。
更新 age:
# 请求
POST student/_doc/2
{
  "age": 10
}

响应

{
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

再次请求数据:
GET student/_doc/2

# {
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "age" : 10
  }
}

结果是 version 从1变成了2,而 name 字段不见了。
原因是 POST student/_doc/2 这种语法的效果是覆盖数据。可以理解为先把原文档删除,再索引新文档。
POST student/_doc/2 的效果相同。
使用 _update 更新文档
如何在 name 不消失的情况下更新 age 呢?用 _update。
示例:

# 请求1
POST student/_doc/2
{
  "name": "李四"
}

# 请求2: 新增 age
POST student/_doc/2/_update
{
  "doc": {
    "age": 10
  }
}

# 查询
GET student/_doc/2

# 查询结果
{
  "_index" : "student",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 6,
  "_seq_no" : 6,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "李四",
    "age" : 10
  }
}

POST student/_doc/2/_update 这种方式会报错:
#! Deprecation: [types removal] Specifying types in document update requests is deprecated, use the endpoint /{index}/_update/{id} instead.

所以,建议用下面的方法:
POST student/_update/2
{
  "doc": {
    "age": 11
  }
}

使用 _update 时,ES 做了下面几件事:
从旧文档构建 JSON
更改该 JSON
删除旧文档
索引一个新文档
使用 _update_by_query 更新文档

POST student/_update_by_query
{
  "query": { 
    "match": {
      "_id": 2
    }
  },
  "script": {
    "source": "ctx._source.age = 12"
  }
}

用下面的方法也行,但会有告警:
POST student/_update_by_query
{
  "query": { 
    "match": {
      "_id": 2
    }
  },
  "script": {
    "inline": "ctx._source.age = 12"
  }
}

执行时告警信息如下:
#! Deprecation: Deprecated field [inline] used, expected [source] instead

也就 inline 已经被废弃了,应该使用 source。 所以,最正确的方式是:
POST student/_update_by_query
{
  "query": { 
    "match": {
      "_id": 2
    }
  },
  "script": {
    "source": "ctx._source.age = 12"
  }
}
Elasticsearch 是一个强大的分布式搜索引擎,用于实时搜索和分析大量数据。在 Elasticsearch 中,你可以通过它的 RESTful API 或者客户端库(如 Java 的官方客户端低级 API 或 Python 的 Elasticsearch 客户端)来添加文档。 以下是通过低级 REST API 添加文档的基本步骤: 1. **连接到集群**: 使用 HTTP 客户端 (如 Postman 或 cURL) 连接到 Elasticsearch 集群的 `_http` 端口,默认是 `localhost:9200`。 2. **创建索引(Index)**: 在操作文档之前,需要先确定一个索引(index)。如果不存在,可以使用 PUT 请求创建它。例如: ``` POST /my_index ``` 3. **定义映射(Mapping)**: 如果索引不存在,或者你想改变字段的数据类型,你需要提供一个映射(mapping),指定每个字段的属性。映射可以在创建索引时一起设置,也可以单独更新。 4. **添加文档**: 使用 `POST` 方法并指定索引和类型(type,从 Elasticsearch 7.x 版本开始不再支持类型,直接在路径上表示即可)来添加文档,示例如下: ``` POST /my_index/_doc/1 { "title": "My Document", "content": "This is some sample content.", "timestamp": "2023-04-01T00:00:00" } ``` 这里 `my_index` 是索引名,`_doc` 类型(或直接路径名)代表文档类型,`1` 是文档 ID,实际应用中可以根据需要自动生成或者使用 UUID。 5. **确认响应**: Elasticsearch 返回一个 JSON 对象,包含操作结果和状态信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值