Elasticsearch 6.3.2跨集群GET按_id查询远程索引报错求助
我完全理解你的痛点:跨集群搜索用POST能正常拉取数据,但直接用GET请求单个远程文档就报404,虽然有临时方案,但想给开发人员提供更友好的简洁URL。这其实是Elasticsearch 6.x版本跨集群搜索(CCS)的一个设计限制,下面给你拆解原因和可行的解决方案:
问题根源
在Elasticsearch 6.3.2中,跨集群搜索的能力仅覆盖搜索类接口(比如_search、_count),而直接通过GET /<remote-cluster>:<index>/<type>/<doc-id>获取单个文档的方式并不被支持。当你发起这个请求时,main集群会尝试在本地查找名为west:error-2019.04的索引——但这个索引只存在于west集群,main本地并没有,所以必然返回index_not_found_exception。
可行解决方案
1. 用GET版的_search接口替代(最简便)
不需要写POST请求体,直接用带查询参数的GET请求就能实现类似单个文档查询的效果,开发人员使用起来和简洁URL几乎一致:
GET http://esmain.example.com:9200/west:error-2019.04/_search?q=_id:M2ywYGoBhIcw2VqxQ9FD&size=1&ignore_unavailable=true
这个请求会精准匹配指定ID的文档,并且只返回1条结果,和直接GET单个文档的体验无差。
2. 封装轻量代理层(追求极致简洁URL)
如果开发团队一定要用/west:error-2019.04/error/<doc-id>这种格式的URL,可以搭建一个简单的API代理(比如用Nginx、Node.js脚本等),将这类GET请求自动转换成对应的_search请求转发给main集群。
举个Nginx配置的简化思路:
location ~ ^/([a-z]+):([^/]+)/([^/]+)/([^/]+)$ { set $cluster $1; set $index $2; set $type $3; set $docid $4; proxy_pass http://esmain.example.com:9200/$cluster:$index/_search?q=_id:$docid&size=1&ignore_unavailable=true; }
这样开发人员访问http://your-proxy.example.com/west:error-2019.04/error/M2ywYGoBhIcw2VqxQ9FD时,就会自动转换成对应的搜索请求,返回目标文档。
3. 升级Elasticsearch版本(长期方案)
如果你有版本升级的计划,Elasticsearch 7.x及以后的版本对跨集群搜索的支持更完善,部分版本已经支持直接通过GET请求获取远程集群的单个文档。不过升级前记得做好兼容性测试,尤其是6.x到7.x有不少语法和特性变化(比如移除了文档类型)。
总结
对于当前6.3.2的环境,推荐先用带查询参数的GET _search请求作为过渡,既满足开发人员对简洁URL的需求,又不需要额外的开发成本。如果团队对URL格式有严格要求,再考虑搭建代理层。
内容的提问来源于stack exchange,提问作者Marc Bernier

