Elasticsearch-核心篇(4)-文档操作

1,525 阅读5分钟

一、添加文档

操作说明

  • 文档可以类比为关系型数据库中的表数据,添加的数据格式为 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
}

错误说明

  1. 不允许使用PUT提交,将会报错
{
	"error": "Incorrect HTTP method for uri [/es/_doc] and method [GET], allowed: [POST]",
	"status": 405
}
  1. 不能遗忘_doc,将会报错
{
	"error": "Incorrect HTTP method for uri [/es] and method [POST], allowed: [GET, DELETE, PUT, HEAD]",
	"status": 405
}

高级操作

  1. 指定生成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
}
  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
}

错误说明

  1. 更新不要忘记_doc,否则将会报错
{
	"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
	}
}

错误说明

  1. 不能忘记请求参数中的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
	}
}

错误说明

  1. 文档不存在时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
}

错误说明

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

错误说明

  1. 删除是使用post,不是delete,否则将会报错
{
	"error": "Incorrect HTTP method for uri [/es/_delete_by_query] and method [DELETE], allowed: [POST]",
	"status": 405
}