【Elasticsearch基础】CRUD操作实践

发布于:2025-03-31 ⋅ 阅读:(24) ⋅ 点赞:(0)

Elasticsearch作为最流行的搜索和分析引擎,其核心CRUD(创建、读取、更新、删除)操作是每个开发者必须掌握的技能。本文将详细介绍Elasticsearch的基础数据操作,并提供可直接复用的curl示例。

1 创建索引与文档

1.1 创建索引

// 语法
PUT /<index_name>
{
  "settings": { ... },  # 索引配置
  "mappings": { ... }   # 字段映射
}
// 创建简单索引(自动应用默认映射)
curl -X PUT "http://192.168.10.33:9200/myindex" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}'

// 创建带自定义映射的索引
curl -X PUT "http://192.168.10.33:9200/myindex_1" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "views": { "type": "integer" },
      "publish_date": { "type": "date" }
    }
  }
}'

1.2 添加文档

# 指定ID创建文档
curl -X POST "http://192.168.10.33:9200/myindx/_doc/1" -H 'Content-Type: application/json' -d'
{
  "name": "无线耳机",
  "price": 799,
  "stock": 200
}'

# 自动生成ID创建文档
curl -X POST "http://192.168.10.33:9200/myindex_1/_doc" -H 'Content-Type: application/json' -d'
{
  "name": "智能手表",
  "price": 2999
}'

# 批量创建文档(更高效)
curl -X POST "http://192.168.10.33:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "myindex", "myindex_1" : "2" } }
{ "name": "蓝牙音箱", "price": 299 }
{ "index" : { "_index" : "myindex", "_id" : "3" } }
{ "name": "电子书阅读器", "price": 899 }
'

2 查询文档

2.1 基础查询

# 按ID查询文档
curl -X GET "http://192.168.10.33:9200/myindex_1/_doc/1?pretty"

# 检查文档是否存在
curl -I "http://192.168.10.33:9200/myindex/_doc/1"

# 获取多个文档
curl -X GET "http://192.168.10.33:9200/_mget" -H 'Content-Type: application/json' -d'
{
  "docs": [
    { "_index": "myindex_1", "_id": "1" },
    { "_index": "myindex_1", "_id": "2" }
  ]
}'

2.2 搜索API

# 简单全文搜索
curl -X GET "http://192.168.10.33:9200/myindex/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "name": "智能"
    }
  }
}'

# 复合查询
curl -X GET "http://192.168.10.33:9200/myindx/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "电子" } }
      ],
      "filter": [
        { "range": { "price": { "gte": 500, "lte": 1000 } } }
      ]
    }
  },
  "sort": [
    { "price": { "order": "desc" } }
  ],
  "from": 0,
  "size": 5
}'

3 更新文档

3.1 全量替换

# 完全替换文档内容(需提供所有字段)
curl -X PUT "http://192.168.10.33:9200/myindx/_doc/1" -H 'Content-Type: application/json' -d'
{
  "name": "无线耳机",
  "price": 699,
  "color": "black"
}'

3.2 部分更新

# 更新单个字段
curl -X POST "http://192.168.10.33:9200/myindex/_update/1" -H 'Content-Type: application/json' -d'
{
  "doc": {
    "price": 649
  }
}'

# 带条件的更新(仅当stock>0时执行)
curl -X POST "http://192.168.10.33:9200/myindex/_update/1" -H 'Content-Type: application/json' -d'
{
  "script": {
    "source": "ctx._source.price -= params.discount",
    "params": {
      "discount": 50
    }
  },
  "upsert": {
    "name": "无线耳机",
    "price": 699
  }
}'

# 批量更新
curl -X POST "http://192.168.10.33:9200/myindex_1" -H 'Content-Type: application/json' -d'
{ "update" : { "_index" : "myindex", "_id" : "1" } }
{ "doc" : { "price" : 599 } }
{ "update" : { "_index" : "myindex", "_id" : "2" } }
{ "script" : { "source": "ctx._source.stock -= 1" } }
'

4 删除操作

4.1 删除文档

# 按ID删除
curl -X DELETE "http://192.168.10.33:9200/myindx/_doc/1"

# 按查询删除
curl -X POST "http://192.168.10.33:9200/myindx/_delete_by_query" -H 'Content-Type: application/json' -d'
{
  "query": {
    "range": {
      "price": { "lt": 300 }
    }
  }
}'

# 批量删除
curl -X POST "http://192.168.10.33:9200/myindx_1" -H 'Content-Type: application/json' -d'
{ "delete" : { "_index" : "myindx", "_id" : "2" } }
{ "delete" : { "_index" : "myindx", "_id" : "3" } }
'

4.2 删除索引

# 删除整个索引(不可逆操作!)
curl -X DELETE "http://192.168.10.33:9200/myindx"

# 删除多个索引
curl -X DELETE "http://192.168.10.33:9200/index1,index2"

# 使用通配符删除
curl -X DELETE "http://192.168.10.33:9200/myindx_2025_01_*"

5 常见错误与解决方案

错误现象

可能原因

解决方案

无法创建文档(409 Conflict)

文档ID已存在

使用PUT覆盖或生成新ID

更新文档版本冲突(409 Conflict)

文档被其他进程修改

获取最新版本后重试

查询返回部分结果(503 Service Unavailable)

分片未分配

检查集群状态,调整分片分配策略

索引只读(403 Forbidden)

磁盘空间不足

清理空间或调整索引配置


网站公告

今日签到

点亮在社区的每一天
去签到