您的位置:首页 > 其它

Elasticsearch CRUD基本操作

2021-02-23 23:32 966 查看

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

目录
  • 文档操作
  • 批量文档操作

    说明

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

    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": ["mov
    56c
    ieId", "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
    {
    
    118e
    "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操作类似,不能进行格式化。

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: