面试题答案
一键面试scripted_upsert参数应用场景
- 复杂更新逻辑:当文档更新不仅仅是简单的字段替换,而是需要根据已有文档内容进行复杂计算、条件判断等逻辑时。例如,电商系统中商品库存更新,不仅要减少库存数量,还要根据库存阈值判断是否需要标记为缺货。
- 个性化定制更新:不同的文档可能需要不同的更新逻辑,通过脚本动态实现。比如,在用户积分系统中,不同等级用户在完成任务后获得积分的计算方式不同。
设置示例
以下以Python的Elasticsearch客户端为例:
from elasticsearch import Elasticsearch
es = Elasticsearch()
doc_id = "1"
doc = {
"title": "示例文档",
"content": "这是一个示例"
}
script = """
if (ctx._source) {
ctx._source.content = ctx._source.content + ',更新内容';
} else {
ctx._source = params.doc;
}
"""
response = es.update(
index="test_index",
id=doc_id,
body={
"script": {
"source": script,
"params": {
"doc": doc
}
},
"scripted_upsert": true,
"upsert": doc
}
)
print(response)
在上述示例中,scripted_upsert
设置为true
,表明如果文档不存在则插入(执行upsert
部分),如果文档存在则执行脚本中的更新逻辑。脚本中判断文档是否存在(ctx._source
是否有值),若存在则更新content
字段,若不存在则插入新文档。