在Rails应用中更新Elasticsearch文档:id参数应置于何处?
解决Elasticsearch Update操作未生效的问题
你遇到的问题很明确——没有指定要更新的文档ID,Elasticsearch的update API必须明确定位到具体的文档才能执行修改,所以得把文档ID作为独立参数传入,而不是放在请求体里。
正确的Update写法
直接指定id参数,同时注意要把更新的字段包裹在doc对象中(这是Update API的规范要求,否则会出现字段覆盖或报错):
$es_client.update( index: 'users', type: 'actions', id: '你的文档唯一ID', # 这里就是需要添加的文档ID参数 body: { doc: { user_id: user, product_id: [recent_positive] } } )
特殊场景:不知道文档ID怎么办?
如果你的业务场景是根据user_id匹配文档,而非直接知道文档ID,可以使用update_by_query API批量更新符合条件的文档,比如要给指定user_id的文档追加product_id元素:
$es_client.update_by_query( index: 'users', type: 'actions', body: { query: { match: { user_id: user } }, script: { source: "ctx._source.product_id.add(params.recent_positive)", params: { recent_positive: recent_positive } } } )
这个脚本会找到所有匹配user_id的文档,把recent_positive值追加到product_id数组里,适合批量或无明确文档ID的场景。
内容的提问来源于stack exchange,提问作者Sowmya CR
相关产品推荐
相关产品推荐

