一、 相关概念介绍
1.1 索引
ES中的索引可以理解为关系型数据库中的“数据库”,索引中的每个文档类比于关系型数据库中的“表”。
1.2 文档
文档是ES中存储的最小单位,类比于关系型数据库中的“行”,文档可以是任意格式的JSON文本,可以包含任意多层嵌套的字段。
1.3 类型
在ES 6.0版本以后,每个索引只有一个类型。类型在ES 7.0版本中已经被废弃,但为了向后兼容,ES仍然提供了默认类型”_doc”。
1.4 路由
路由是ES中文档的分片算法,通过对文档的某个字段进行哈希运算的方式,将文档分配到对应的分片上。
二、 删除索引数据
ES提供了通过API删除索引数据的方式,支持单个文档的删除,也支持按照条件查询结果集后进行删除。
2.1 删除单个文档
ES提供了delete API来删除单个文档。使用该API,我们需要提供要删除文档的索引名称,类型名称和文档ID三个参数。
DELETE /index_name/type_name/document_id
例如,要删除名为”my_index”,类型为”_doc”,ID为”1″的文档,我们可以使用下面的代码:
DELETE /my_index/_doc/1
如果成功删除文档,返回结果会带有下面的信息:
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
2.2 删除满足条件的文档
除了单个文档的删除,ES还提供了delete by query API,通过查询条件删除满足条件的文档。
POST /index_name/_delete_by_query
{
"query": {
"match": {
"key": "value"
}
}
}
例如,要删除”my_index”索引中,属性”age”小于30的文档,我们可以使用下面的命令:
POST /my_index/_delete_by_query
{
"query": {
"range": {
"age": {
"lt": 30
}
}
}
}
如果满足条件的文档删除成功,返回的结果包含下面的信息:
{
"took": 3308,
"timed_out": false,
"total": 2000,
"deleted": 2000,
"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": []
}
三、 删除索引
在实际情况中,通常我们会有删除整个索引的需求,例如清空缓存,重建索引等等。ES中提供了delete index API来删除整个索引。
DELETE /index_name
例如删除名为”my_index”的索引:
DELETE /my_index
如果成功删除索引,返回结果会带有下面的信息:
{
"acknowledged": true
}
四、 删除索引的一些注意事项
在删除索引时,需要注意下面的问题:
4.1 确认操作后再进行删除
删除索引操作是不可逆的行为,必须在确认此操作之后执行。在使用HTTP API执行删除操作时,必须明确设置头 “Content-Length: 0″。
4.2 删除索引会删除所有数据
删除索引会删除索引中的所有文档,如果需要保存数据,请在删除之前备份数据。
4.3 删除数据会留下记录
使用delete API和delete by query API删除数据时,ES会在_translog日志中留下记录,以便在数据丢失时进行恢复,因此删除数据并不会立即腾出磁盘空间。
五、 总结
本文从相关概念介绍、删除单个文档、删除满足条件的文档、删除整个索引上分别展开了阐述。同时,我们也提醒了在删除索引时需要注意的问题。
