ElasticSearch的一些CRUD操作

这篇博客详细介绍了如何使用 Elasticsearch 进行索引操作,包括创建、删除和查看索引,以及文档的 CRUD 操作。此外,还深入讲解了搜索功能,如全文搜索、条件搜索、组合搜索、过滤搜索和聚合搜索,展示了如何进行排序、筛选及分段聚合等高级用法,是学习 Elasticsearch 搜索和分析功能的实用教程。

参考链接:http://www.macrozheng.com/#/reference/elasticsearch_start

集群状态查看

  • 查看集群健康状态
GET /_cat/health?v
  • 查看节点状态
GET /_cat/nodes?v
  • 查看所有索引信息
GET /_cat/indices?v

索引操作

  • 创建索引并查看
PUT /customer
GET /_cat/indices?v
  • 删除索引并查看
DELETE /customer
GET /_cat/indices?v

类型操作

  • 查看文档的类型
GET /bank/account/_mapping

CRUD

# 添加一个索引
PUT /demo_index/?pretty

# 添加一个索引,并且里面包含一个id是1的文档。_doc是文档类型
PUT /book/_doc/1
{
  "name":"测试数据1",
  "descreption":"这是一个描述",
  "studymodle":"000001",
  "price":88.88,
  "timestamp":"2021年4月12日14:10:23",
  "tags":["elastic stack","kibana"]
}

PUT /book/_doc/2
{
  "name":"测试数据2",
  "descreption":"这是一个描述",
  "studymodle":"000001",
  "price":88.88,
  "timestamp":"2021年4月12日14:10:23",
  "tags":["elastic stack","kibana"]
}

# 获取索引里对应id的信息
GET /book/_doc/2

# 修改文档里的部分信息(过时的请求路径)
POST /book/_doc/2/_update
{
  "doc":{
    "name":"这是一个修改过的测试文档"
  }
}

# 修改文档里的部分信息(推荐使用的请求路径)
POST /book/_update/2
{
  "doc":{
    "name":"这是一个用新的请求路径修改的测试文档"
  }
}

# 删除一个文档
DELETE /book/_doc/1

# 自动生成id。生成的id是用GUID算法生成的字符串,在es集群和分布式集群当中都不会冲突
POST /book/_doc
{
  "testfile":"测试字段"
}

# 定制_source返回的字段数据
GET /book/_doc/2?_source_includes=name,price

# 使用脚本更新
POST /book/_update/5
{
  "script": "ctx._source.price+=1"
}

数据搜索

搜索入门

  • 搜索全部
GET /bank/_search
{
  "query": { "match_all": {} }
}
  • 分页搜索,from表示偏移量,从0开始,size表示每页显示的数量
GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 0,
  "size": 10
}

image.png

  • 搜索排序,使用sort表示,例如按balance字段降序排列
GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}
  • 搜索并返回指定字段内容,使用_source表示,例如只返回account_numberbalance两个字段内容
GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}

条件搜索

  • 条件搜索,使用match表示匹配条件,例如搜索出account_number20的文档
GET /bank/_search
{
  "query": {
    "match": {
      "account_number": 20
    }
  }
}
  • 文本类型字段的条件搜索,例如搜索address字段中包含mill的文档,对比上一条搜索可以发现,对于数值类型match操作使用的是精确匹配,对于文本类型使用的是模糊匹配
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "_source": [
    "address",
    "account_number"
  ]
}

image.png

  • 短语匹配搜索,使用match_phrase表示,例如搜索address字段中同时包含milllane的文档
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

组合搜索

  • 组合搜索,使用bool来进行组合,must表示同时满足,例如搜索address字段中同时包含milllane的文档
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
  • 组合搜索,should表示满足其中任意一个,搜索address字段中包含mill或者lane的文档
GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
  • 组合搜索,must_not表示同时不满足,例如搜索address字段中不包含mill且不包含lane的文档
GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
  • 组合搜索,组合mustmust_not,例如搜索age字段等于40state字段不包含ID的文档
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

过滤搜索

  • 搜索过滤,使用filter来表示,例如过滤出balance字段在20000~30000的文档
GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

搜索聚合

  • 对搜索结果进行聚合,使用aggs来表示,类似于MySql中的group by,例如对state字段进行聚合,统计出相同state的文档数量
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

image.png

  • 嵌套聚合,例如对state字段进行聚合,统计出相同state的文档数量,再统计出balance的平均值
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

image.png

  • 对聚合搜索的结果进行排序,例如按balance的平均值降序排列
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}
  • 按字段值的范围进行分段聚合,例如分段范围为age字段的[20,30] [30,40] [40,50],之后按gender统计文档个数和balance的平均值
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值