zoukankan      html  css  js  c++  java
  • Elasticsearch CRUD基本操作

    前言
    本次我们聊一聊Elasticsearch的基本操作CRUD,他跟我们常用的关系型数据库的操作又有什么不一样的地方呢?今天我们就来好好讲解一番。

    说明

    本次演示用的版本是7.11。
    工具可以使用Kibana的控制台,界面美观且有一定的缩进,而且能简化命令行的curl操作,如果对安装有问题的,可以看一下我之前的文章。

    image.png

    API约定

    关系型数据库用的是SQL进行数据的访问,而Elasticsearch用的是REST进行数据的访问,HTTP的请求头PUT、GET、POST、DELETE正好可以对应CRUD(create、read、update、delete)四种数据操作。

    数据的格式用的是JSON。

    索引操作

    创建索引

    创建索引movie

    PUT /movie
    {
      "settings": {
        "index": {
          "number_of_shards": 1,
          "number_of_replicas": 0
        }
      }
    }
    

    number_of_shards是主分片数,number_of_replicas是一个主分片有多少个本,那么总的分片数就是“(number_of_replicas + 1) * number_of_shards”

    查看索引

    GET /movie/
    

    删除索引

    DELETE /movie/
    

    文档操作

    插入文档

    7.x版本,type默认是“_doc”。可以用POST,也可以用PUT

    // 自动生成_id
    POST /movie/_doc
    {
      "title": "The Pursuit of Happyness",
      "actors": [
        "Will Smith",
        "Jaden Smith",
        "Thandie Newton"
      ]
    }
    
    // 指定_id=1
    PUT /movie/_doc/1
    {
      "title": "The Pursuit of Happyness",
      "actors": [
        "Will Smith",
        "Jaden Smith",
        "Thandie Newton"
      ]
    }
    
    // 演示覆盖
    PUT /movie/_doc/1
    {
      "title": "xxx"
    }
    

    如果是指定_id的情况下(称为index操作),那么如果文档已经存在的话,会直接进行覆盖,也就是如果里面有些字段没传,那个字段就不会存储了,比如上面第三个请求,执行完后去获取“_id=1”的数据,只能获取到title字段,actors字段是不存在的。

    更新文档

    更新“_id=1”的数据,注意需要有“doc”。如果用“POST /movie/_update/1”这种语法,就直接覆盖了。

    POST /movie/_update/1
    {
      "doc":{
        "title": "The Pursuit of Happyness xxx"
      }
    }
    

    删除文档

    删除“_id=1”的数据

    DELETE /movie/_doc/1
    

    获取文档

    获取“_id=1”的数据

    GET /movie/_doc/1
    

    搜索文档

    GET /movies/_search
    {
      "profile": "true",
      "_source": ["movieId", "title","genres"], 
      "sort": [{"movieId": "desc"}],
      "from": 0,
      "size": 3,
      "query": {
        "match_all": {}
      }
    }
    
    • movies是之前导入的数据,非前面用的movie,需要测试的话要先导入一下数据。
    • profile 相当于MySQL中的explain
    • _source 是要返回的字段

    上面的请求,类比SQL如下

    select movieId, title, genres from movies order by movieId desc limit 0, 3
    

    更复杂的搜索查询,后面持续更新。

    批量文档操作

    批量操作

    POST movie/_bulk
    {"index":{"_index":"movie","_id":1}}
    {"title": "xxx xx"}
    {"index":{"_index":"movie","_id":2}}
    {"title": "The Pursuit of Happyness"}
    {"update":{"_index":"movie","_id":2}}
    {"doc":{"title": "xxx xx"}}
    

    支持在一次API调用中,对不同的索引做不同的操作,减少网络请求的次数,提高性能。支持的操作有index、create、update、delete。批量操作,如果其中一条有错误没法执行,不会阻碍其他的请求,会继续执行下去。

    请求体要特别注意一下,不能格式化,而且第一行指定index跟id,第二行指定数据,以此类推。

    批量读取

    请求体可以格式化

    GET _mget
    {
      "docs": [
        {
          "_index": "movie",
          "_id": 1
        },
        {
          "_index": "movie",
          "_id": 2
        }
      ]
    }
    

    如果是对同一个index进行操作,可以在URI指定index

    GET movie/_mget
    {
      "docs": [
        {
          "_id": 1
        },
        {
          "_id": 2
        }
      ]
    

    批量查询

    GET /movies/_msearch
    {}
    {"from":0,"size":1,"query":{"match_all":{}}}
    {}
    {"from":0,"size":2,"query":{"match_all":{}}}
    

    与_bulk操作类似,不能进行格式化。

    __EOF__

     


     

    欢迎转载,但请注明出处!
    欢迎大家一起交流学习!如果有什么疑问,大家可以在评论区一起交流!
    如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是我的最大动力!

  • 相关阅读:
    LCG(linear congruential generator): 一种简单的随机数生成算法
    (转载)STL map与Boost unordered_map的比较
    永远让比较函数对相等的值返回false
    NYOJ 654喜欢玩warcraft的ltl(01背包/常数级优化)
    Java杂记
    流量控制与拥塞控制
    PHP获取当前页面地址
    表单验证实例
    博客几种可选代码配色方案
    $_POST,$_GET,$_REQUEST区分
  • 原文地址:https://www.cnblogs.com/powercto/p/14438907.html
Copyright © 2011-2022 走看看