面试题答案
一键面试doc_as_upsert 参数的优势
- 简化操作逻辑:当使用常规更新方式时,如果文档不存在,需要先执行创建操作,再执行更新操作。而使用
doc_as_upsert=true
,无论文档是否存在,都可以使用一个操作来完成创建或更新,简化了代码逻辑。例如,在更新一个包含用户信息的复杂文档,用户信息文档可能包含基本信息、联系方式、工作经历等多层嵌套结构。常规方式需要先检查用户文档是否存在:
from elasticsearch import Elasticsearch
es = Elasticsearch()
user_id = "123"
user_info = {
"name": "John Doe",
"contact": {
"email": "johndoe@example.com",
"phone": "1234567890"
},
"work_experience": [
{
"company": "Company A",
"duration": "2 years"
}
]
}
if not es.exists(index='users', id=user_id):
es.create(index='users', id=user_id, body=user_info)
else:
es.update(index='users', id=user_id, body={"doc": user_info})
使用 doc_as_upsert
时:
es.update(index='users', id=user_id, body={"doc": user_info, "doc_as_upsert": true})
- 原子性操作:
doc_as_upsert
确保整个创建或更新操作是原子性的。这意味着在并发情况下,不会出现部分更新或创建失败的情况。假设有多个进程同时尝试更新或创建同一个复杂文档,如果使用常规方式,可能会出现竞争条件导致数据不一致。而doc_as_upsert
可以避免这种情况,保证数据的一致性。例如,多个进程同时更新一个产品文档,产品文档包含产品详情、价格、库存等多层嵌套结构。doc_as_upsert
会确保要么整个操作成功,要么整个操作失败,不会出现部分更新成功导致数据混乱的情况。 - 处理复杂嵌套结构:对于多层嵌套的复杂文档,
doc_as_upsert
可以直接将整个复杂结构作为文档进行更新或创建,无需担心嵌套层次带来的更新逻辑复杂性。例如,一个电商商品文档,包含商品基本信息、规格参数(又是一个嵌套结构)、评论(列表嵌套结构)等。使用doc_as_upsert
时,可以直接将整个商品文档结构传入更新操作,Elasticsearch 会正确处理嵌套结构的更新或创建,无需额外处理嵌套结构的更新细节。