Elasticsearch-核心篇(5)-文档操作
文章目录
- 一、添加文档
- 二、更新文档
- 2.1 全量更新
- 2.2 增量更新
- 三、查询文档
- 3.1 单个查询
- 3.2 查询所有
- 四、删除文档
- 4.1 删除单个文档
- 4.2 条件删除文档
一、添加文档
操作说明
- 文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
- 注意需要在索引后面添加_doc,表示操作文档
- 在未指定id生成情况,每执行一次post将生成一个新文档
- 如果index不存在,将会默认创建
命令示例
POST es/_doc
{
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999
}
返回示例
{
"_index"【索引】: "es",
"_type"【类型-文档】: "_doc",
"_id"【唯一标识】: "DBeE23kBo6bwxxzx9qzl", #可以类比为MySQL中的主键,随机生成
"_version"【版本】: 1,
"result"【结果】: "created", #这里的create表示创建成功
"_shards"【分片】: {
"total"【分片 - 总数】: 2,
"successful"【分片 - 成功】: 1,
"failed"【分片 - 失败】: 0
},
"_seq_no": 0,
"_primary_term": 1
}
错误说明
不允许使用PUT提交,将会报错
{
"error": "Incorrect HTTP method for uri [/es/_doc] and method [GET], allowed: [POST]",
"status": 405
}
不能遗忘_doc,将会报错
{
"error": "Incorrect HTTP method for uri [/es] and method [POST], allowed: [GET, DELETE, PUT, HEAD]",
"status": 405
}
高级操作
指定生成id
- 上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES服务器会随机生成一个
如果想要自定义唯一性标识,需要在创建时指定:http://{ {ip:port}}/es/_doc/1
- http://\{ {ip:port}}//_doc/
- 指定后将会创建成功,重复执行请求时将更新文档,而不是创建新文档,此时version字段将更新
{
"_index": "es",
"_type": "_doc",
"_id"【此处id变成指定的id】: "1",
"_version"【版本每次都会更新】: 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 7,
"_primary_term": 1
}
PUT创建文档,在未指定id时put创建文档将会报错,而指定id后可以通过put创建或者更新文档,只是请求方式变,其他内容不变
二、更新文档
2.1 全量更新
操作说明
- 和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
命令示例
POST es/_doc/1
{
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.0
}
返回示例
{
"_index": "es",
"_type": "_doc",
"_id": "1",
"_version"【每修改一次版本号+1】: 7,
"result"【updated表示更新】: "updated",
"_shards"【分片信息】: {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 10,
"_primary_term": 1
}
错误说明
更新不要忘记_doc,否则将会报错
- http://{ {ip:port}}/es/1
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Rejecting mapping update to [es] as the final mapping would have more than 1 type: [_doc, 1]"
}
],
"type": "illegal_argument_exception",
"reason": "Rejecting mapping update to [es] as the final mapping would have more than 1 type: [_doc, 1]"
},
"status": 400
}
2.2 增量更新
操作说明
- 通过指定_doc方式默认是全量更新,如果需要更新指定字段则需要将**_doc改为_update**
- 请求内容需要增加doc表示,原始{“key”: value},更新{“doc”: {“key”: value}}
命令示例
POST es/_update/1
{
"doc": {
"price": 1999
}
}
返回示例
{
"_index": "es",
"_type": "_doc",
"_id": "1",
"_version": 8,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 11,
"_primary_term": 1
}
查询结果,看到price已经更新
{
"_index": "es",
"_type": "_doc",
"_id": "1",
"_version": 8,
"_seq_no": 11,
"_primary_term": 1,
"found": true,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 1999
}
}
错误说明
不能忘记请求参数中的doc
- 请求参数
{
"price": 1999
}
- 错误信息
{
"error": {
"root_cause": [
{
"type": "x_content_parse_exception",
"reason": "[2:3] [UpdateRequest] unknown field [price]"
}
],
"type": "x_content_parse_exception",
"reason": "[2:3] [UpdateRequest] unknown field [price]"
},
"status": 400
}
三、查询文档
3.1 单个查询
操作说明
- 查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询
命令示例
GET es/_doc/1
返回示例
{
"_index"【索引名称】: "es",
"_type"【索引类型】: "_doc",
"_id"【id信息】: "1",
"_version"【当前版本】: 4,
"_seq_no": 7,
"_primary_term": 1,
"found"【查询结果,true表示查找到,false表示未查找到】: true,
"_source"【表示原始数据信息】: {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999
}
}
错误说明
文档不存在时found为false
{
"_index": "es",
"_type": "_doc",
"_id": "12",
"found"【未找到】: false
}
3.2 查询所有
操作说明
- 上述只能查询单个,可以查询所有文档
- 将**_doc/替换为_search**
命令示例
GET es/_search
返回示例
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits"【命中统计】: {
"total"【命中总数】: {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits"【命中信息】: [
{
"_index": "es",
"_type": "_doc",
"_id": "GBe923kBo6bwxxzxoKxP",
"_score": 1,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999
}
}
]
}
}
四、删除文档
4.1 删除单个文档
操作说明
- 删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)
命令示例
DELETE es/_doc/1
返回示例
{
"_index": "es",
"_type": "_doc",
"_id": "1",
"_version"【删除也会更新版本】: 9,
"result"【删除结果】: "deleted",
"_shards"【分片删除】: {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 12,
"_primary_term": 1
}
错误说明
删除不存在的文档
{
"_index": "es",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result"【文档未找到】: "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 13,
"_primary_term": 1
}
4.2 条件删除文档
操作说明
- 一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除
不指定ID分别增加多条数据,使用创建文档时的脚本
{
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999
}
条件查询需要http://{ {ip:port}}/es/_delete_by_query
- 替换_doc及后的内容为**_delete_by_query**根据query删除
- 查询请求参数需要使用query字段表示,然后在其中再使用match表示删除匹配的信息
- 注意:条件删除需要使用POST
命令示例
POST es/_delete_by_query
{
"query": {
"match": {
"price": 3999
}
}
}
返回示例
{
"took": 28,
"timed_out"【是否超时】: false,
"total"【总数量】: 4,
"deleted"【删除数量】: 4,
"batches"【批次】: 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
错误说明
删除是使用post,不是delete,否则将会报错
{
"error": "Incorrect HTTP method for uri [/es/_delete_by_query] and method [DELETE], allowed: [POST]",
"status": 405
}
还没有评论,来说两句吧...