面试题答案
一键面试不同版本 ElasticSearch 返回体差异
- 早期版本(如 5.x 之前):
- 命中文档数量:可能在返回体的
hits.total
字段体现,这里total
可能是一个数字,直接表示命中的文档总数。 - 删除状态:删除操作执行后,返回体可能会在根层级包含类似
_shards
字段,其中successful
字段表示成功处理的分片数,failed
字段表示失败的分片数。整体删除状态需结合这两个字段以及hits.total
来判断,如果successful
等于总分片数且hits.total
不为 0,则删除大概率成功。
- 命中文档数量:可能在返回体的
- 5.x - 6.x 版本:
- 命中文档数量:
hits.total
字段变为一个对象,例如{ "value": 10, "relation": "eq" }
,value
表示命中的文档数量,relation
可能的值有eq
(等于)、gte
(大于等于)等,用于更精确表示命中数量与value
的关系。 - 删除状态:
_shards
字段依旧存在,结构类似早期版本,但对删除操作的详细状态描述可能更丰富,例如可能会有每个分片具体的操作结果(成功、失败原因等)。同时,返回体可能会包含took
字段,表示操作执行所花费的时间,也可辅助判断操作状态。
- 命中文档数量:
- 7.x 及之后版本:
- 命中文档数量:
hits.total.value
直接表示命中的文档数量,简化了获取命中数量的方式。relation
字段在一些场景下依然存在,但默认如果命中数量不超过一定阈值(10000),relation
会是eq
且省略显示。 - 删除状态:
_shards
字段进一步优化,对于失败的分片,提供更详细的错误信息。同时,_meta
字段可能会被引入,用于携带一些元数据信息,例如版本相关的信息等,有助于更全面判断删除操作的状态。
- 命中文档数量:
通用解析方法确保操作成功判定准确性
- 命中文档数量解析:
- 无论版本,先判断
hits
字段是否存在。若存在,再根据不同版本获取命中数量。对于早期版本直接获取hits.total
值;5.x - 6.x 版本从hits.total.value
获取;7.x 及之后版本同样从hits.total.value
获取。 - 检查获取到的命中数量是否符合预期逻辑,例如是否为非负数等。
- 无论版本,先判断
- 删除状态解析:
- 查找
_shards
字段,确保successful
字段的值等于总分片数(可通过_shards.total
获取总分片数)。如果failed
字段值为 0 且successful
等于total
,则删除操作在分片层面基本成功。 - 对于 7.x 及之后版本,若
_meta
字段存在,检查其中是否有与删除操作相关的错误提示等元数据信息。同时,检查返回体中是否有其他异常字段或错误信息提示,例如error
字段等。 - 结合
took
字段,如果操作时间过长且_shards
状态看似成功,也需谨慎判断,可能存在潜在的性能问题或部分未完全同步的情况,可考虑增加后续的验证步骤,如再次查询相关文档是否确实被删除等。
- 查找