面试题答案
一键面试原理区别
- 直接修改文档内容:直接对文档的字段进行整体替换。Elasticsearch会将原文档删除,然后重新索引新的文档内容。例如,有一个文档包含
{"name": "Alice", "age": 30}
,若直接修改为{"name": "Bob", "age": 31}
,Elasticsearch会先删除原文档,再重新建立新文档的索引。 - 使用脚本更新:通过执行一段脚本(如Painless脚本),以更细粒度地修改文档中的字段。脚本可以基于文档当前的内容进行计算和修改。例如,原文档
{"count": 5}
,脚本可以实现ctx._source.count++
,在不获取原文档整体内容的情况下,对count
字段进行自增操作。
性能区别
- 直接修改文档内容:由于要删除原文档并重新索引新文档,涉及的IO操作较多,尤其是文档较大时,性能开销相对较大。在高并发更新场景下,可能会导致索引性能下降。
- 使用脚本更新:不需要完全替换文档,仅修改相关字段,减少了索引的IO操作,性能相对较好,特别是对文档部分字段频繁更新的场景。例如对计数器类型字段的频繁更新,使用脚本更新性能优势明显。
灵活性区别
- 直接修改文档内容:简单直接,适用于对文档内容进行整体替换的场景,但对于复杂的基于现有字段值的计算或条件判断后更新不太灵活。比如,无法在不获取文档整体内容的情况下,根据某个字段值动态修改另一个字段。
- 使用脚本更新:非常灵活,可以编写复杂的逻辑,如条件判断、数学运算、字符串操作等。例如,可以编写脚本根据文档中的
status
字段值,动态修改priority
字段。
适用业务场景举例
- 直接修改文档内容:
- 用户信息修改:当用户修改自己的基本信息,如姓名、联系方式等,整体替换文档内容比较直观和简单。例如,用户修改了姓名和电话号码,直接提交新的用户信息文档进行更新。
- 商品信息更新:商品的描述、价格等信息的整体变动,可以通过直接修改文档实现。如商品价格调整,直接提交新的商品信息文档包含新价格。
- 使用脚本更新:
- 点赞/评论计数:每次用户点赞或评论一篇文章时,通过脚本对文章文档中的点赞数或评论数字段进行自增操作,无需获取和重新提交整个文章文档。
- 基于条件的字段更新:例如,订单状态为“已支付”时,根据订单金额动态调整用户的积分。可以编写脚本在订单文档状态满足条件时,计算并更新用户积分字段。