升级Elasticsearch 8.0后delete函数失效问题排查
Elasticsearch 8.x客户端delete接口异常排查(文档未真正删除)
我们的React项目使用@elastic/elasticsearch npm包,升级到8.0版本后,delete函数出现异常。代码实现如下:
客户端实例声明
import { Client } from '@elastic/elasticsearch'; import Config from 'src/config'; const client = new Client(Config.get('/authentication/elastic')); export default client;
delete函数调用
public async delete(id: string): Promise<any> { try { return await this.client.delete({ index: this.indexName, id: id, }); } catch (e) { return null; } }
调用后Promise未抛出错误,返回结果如下:
{ "_index": "visitor_0", "_id": "RN-PdzFW-Yfr0ahMp", "_version": 3, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 396, "_primary_term": 22 }
但实际问题是:文档并未被删除,仅被更新为空内容。手动在Elasticsearch控制台执行删除、手动编写小脚本调用delete接口都能正常删除目标文档。
以下是可能导致该问题的原因:
- 客户端配置异常:检查
Config.get('/authentication/elastic')返回的配置项,是否误设置了filter_path等会篡改响应的参数,导致客户端收到伪造的成功响应;同时确认是否指定了错误的apiVersion,8.x客户端默认适配8.x版本ES,若配置旧版本可能引发行为不一致。 - 请求被拦截或篡改:React项目中是否存在全局请求拦截逻辑,或者打包工具、代理服务器修改了请求方法/参数——比如把
DELETE请求转成POST/PUT,导致实际执行的是更新操作而非删除。 - 索引配置或分片同步问题:虽然返回结果显示分片执行成功,但主分片返回成功后副本分片未同步的情况可能存在;另外检查目标索引是否开启了特殊的软删除或版本控制配置,不过软删除默认不会导致文档保留为空。
- 版本兼容问题:确认Elasticsearch服务端和客户端版本是否匹配,若服务端是7.x而客户端用8.x(或反之),可能出现接口行为不一致的情况。
- 文档路由不匹配:虽然返回的
_id正确,但如果文档的路由规则和客户端请求的路由不一致,可能导致实际删除的是一个不存在的文档(ES对不存在的文档执行delete也会返回result: 'deleted'),而你看到的空文档是另一个路由下的同名ID文档。
内容的提问来源于stack exchange,提问作者JoanFastory
相关产品推荐
相关产品推荐

