一、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": []
}