文档的操作

#ES #文档 #CRUD #Elasticsearch

总结
  • 文档 CRUD 都是 REST 风格,PUT 指定 ID,POST 自动生成 ID
  • _update 是局部更新,只改传入的字段;直接 PUT 是全量替换
  • script 支持动态更新,可以做条件判断和字段增删

1. 查询文档

查单个

GET localhost:9200/nba/_doc/1

批量查(跨索引)

POST localhost:9200/_mget
{
  "docs": [
    { "index": "nba", "_id": "1" },
    { "index": "nba", "_id": "2" }
  ]
}

批量查(同一索引)

POST localhost:9200/nba/_mget
{
  "docs": [
    { "_id": "1" },
    { "_id": "2" }
  ]
}

也可以直接用 ids 简写:

{ "ids": ["1", "2"] }

2. 新增文档

指定 ID(ID 已存在会覆盖)

PUT localhost:9200/nba/_doc/1

指定 ID,防止覆盖(ID 已存在会报错)

PUT localhost:9200/nba/_doc/1?op_type=create

自动生成 ID

POST localhost:9200/nba/_doc
{
  "name": "哈登",
  "team_name": "火箭",
  "position": "得分后卫",
  "play_year": "10",
  "jerse_no": "13"
}

3. 修改文档

3.1 局部更新

只更新传入的字段,其他字段不动:

POST localhost:9200/nba/_update/1
{
  "doc": {
    "position": "控球后卫"
  }
}

3.2 用 script 更新

动态新增字段

{
  "script": "ctx._source.age = 18"
}

删除字段

{
  "script": "ctx._source.remove('age')"
}

条件更新(带 upsert)

文档不存在时 age 初始化为 1,存在时 age += 4:

{
  "script": {
    "source": "ctx._source.age += params.age",
    "params": {
      "age": 4
    }
  },
  "upsert": {
    "age": 1
  }
}

4. 删除文档

DELETE localhost:9200/nba/_doc/1

6. 面试相关

文档是 ES 操作的基本单元,如果你被问到文档的读写原理,可以重点准备 ES面试题 中的写入原理、搜索原理相关问题。