ElasticSearch入门二:文档的基本操作

228 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

上一篇文章:ElasticSearch入门一:入门安装和索引基本操作

一、ElasticSearch文档RESTful操作

1.1 创建文档

当索引创建好了之后,就可以来创建文档了,并且添加数据进去。这里的文档可以类比成关系型数据库的数据表,文档里面的每一个字段可以类比成关系型数据库的列,以此来迅速记忆。

创建文档:

POST http://127.0.0.1:9200/shopping/_doc
{

    "title":"投影仪",
    "category":"坚果",
    "images":"https://img0.jmgo.com/images/202110/goods_img/735_P_1634695912904.jpg",
    "price":5999.00
}

此时请求方式必须是POST不能是PUT,否则会发生错误,返回405状态码。 创建成功之后返回的结果:

{
    "_index": "shopping", # 所在的索引
    "_type": "_doc", # 类型是文档
    "_id": "Xhsa2ncBlvF_7lxyCE9G", # 唯一标识,这里是自动生成的
    "_version": 1, # 当前文档的版本
    "result": "created", # create表示创建成功
    "_shards": { # 分片
        "total": 2, # 分片-总数
        "successful": 1, # 分片-成功
        "failed": 0  # 分片-失败
    },
    "_seq_no": 0,
    "_primary_term": 1
}

在没有指定文档的id的时候,ElasticSearch会自动生成一个id,所以可以在创建文档时指定id,如下:

POST http://127.0.0.1:9200/shopping/_doc/1

{
    "title":"坚果投影仪",
    "category":"坚果",
    "images":"https://img0.jmgo.com/images/202110/goods_img/735_P_1634695912904.jpg",
    "price":5999.00
}

在没有指定id时,此请求不是幂等的,多次请求会创建多个字段一样的文档,但是id不同;当指定id创建文档时,第二次创建就会,返回文档已存在的错误信息。

1.2 查看文档

查看文档时,需要指明文档的唯一性标识,就好像我们在用MySQL中数据的主键查询。如下:

GET http://127.0.0.1:9200/shopping/_doc/1

# 结果
{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1",
    "_version": 2,
    "_seq_no": 2,
    "_primary_term": 2,
    "found": true, # true表示查找到,false表示未查找到
    "_source": { # 文档信息
        "title": "坚果投影仪",
        "category": "坚果",
        "images": "http://www.gulixueyuan.com/hw.jpg",
        "price": 5999.00
    }
}

1.3 修改文档

和新增文档的请求URL一样,输入相同的URL地址请求,如果请求体变化,会将原有的数据内容覆盖,即修改。如下:

POST http://127.0.0.1:9200/shopping/_doc/1

{
    "title":"坚果投影仪pro",
    "category":"坚果",
    "images":"https://img0.jmgo.com/images/202110/goods_img/735_P_1634695912904.jpg",
    "price":6999.00
}

相应结果:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1",
    "_version": 2, # 版本号+1
    "result": "updated", # updated表示数据被更新
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 2
}

1.4 修改字段

在上面修改文档时,我们有时只是想修改某一个字段,提交请求时只提交某些字段的信息。这么常见的问题ElasticSearch肯定是支持的:

POST http://127.0.0.1:9200/shopping/_update/1

{
    "doc": {
        "price":3900.00
    }
}

修改成功之后,版本号相对应的+1。此时也可以通过id去查询该文档,可以看到,已经更新成功。

1.5 删除文档

学习到这里,可以知道,要删除文档,那必然是DELETE请求,并且指定文档id:

DELETE http://127.0.0.1:9200/shopping/_doc/1

返回结果:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1",
    "_version": 4, #对数据的操作,都会更新版本
    "result": "deleted", # deleted表示数据被标记为删除
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 2
}

哎呦,看到这返回结果,version怎么+1了,这不是删除吗?因为ElasticSearch删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。 当我们再去查询的时候,found字段就会返回false了。

1.6 条件删除

有时候我们删除并不是都是通过id去删除,而是想用其他条件去删除,此时我们可以这样用:

POST http://127.0.0.1:9200/shopping/_delete_by_query
{
    "query":{
        "match":{
            "category": "坚果",
         }
    }
}

上面的意思是把category为坚果的文档全都删除。返回结果:

{

    "took": 175, # 操作耗时
    "timed_out": false, # 操作是否超时
    "total": 2, # 匹配到的总数
    "deleted": 2, # 被删除的数量
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "failures": []
}