Python Elasticsearch 7.13.1使用update_by_query无报错未更新文档
问题原因及解决方法
返回结果中total为0,说明请求已正常发送到ES集群,但查询条件未匹配到任何文档,结合「相同查询在Kibana可正常执行」的特征,按优先级排查以下问题:
1. 优先验证查询变量的类型匹配
user_id.keyword是关键字类型,只能匹配字符串格式的值,检查你代码中user_id变量的类型:
- 如果是数字类型(int/float),需要转为字符串后再传入查询:
es_query = { "query": { "match": {"user_id.keyword": str(user_id)} }, "script": { "source": "ctx._source.user_level = params.user_level", "params": { "user_level": user_level }, "lang": "painless" } }
你注释的bool查询中直接用term查询user_id(非keyword字段),如果user_id的mapping是text+keyword双类型,直接查user_id字段也会出现匹配不到精确值的问题,确认保留查user_id.keyword的逻辑。
2. 验证基础配置一致性
- 确认Python客户端连接的ES集群、索引名
articles和Kibana操作的目标完全一致,避免连错环境/索引 - 7.x及以上版本ES已废弃自定义类型,
doc_type='_doc'参数无需显式传递,可以去掉该参数尝试 refresh参数建议传布尔值True而非字符串'true',部分客户端版本对字符串格式的兼容性不佳
3. 验证查询逻辑正确性
单独调用search接口验证当前查询是否能匹配到文档,快速定位问题范围:
search_resp = es.search( index='articles', body={"query": {"match": {"user_id.keyword": user_id}}} ) # 打印匹配到的文档总数 print(search_resp['hits']['total']['value'])
如果此处返回结果大于0,再检查update_by_query的其他参数:
- 如果你的文档写入时指定了自定义routing,需要在update_by_query参数中补充
routing=你的routing值,否则请求无法路由到对应分片查询文档 - 检查客户端账号权限,确认拥有
articles索引的读、写权限,无权限时查询会返回空结果不报错
内容的提问来源于stack exchange,提问作者Ankita
相关产品推荐
相关产品推荐

