首页 > 解决方案 > ElasticSearch 跨集群 GET by _id

问题描述

我有 3 个 ElasticSearch 6.3.2 集群:主集群、东集群和西集群。'main' 配置为在东部和西部执行跨集群搜索。这很好用,因为我可以对 main 执行 POST 查询并从所有 3 个集群中获取数据。但是,我很难从 main 对远程集群执行一些 GET 查询。例如:

http://esmain.example.com:9200/west:error-2019.04/_search

产生命中;一条记录的_id为“M2ywYGoBhIcw2VqxQ9FD”

如果我尝试通过 GET 仅查询此记录,如下所示:

http://esmain.example.com:9200/west:error-2019.04/error/M2ywYGoBhIcw2VqxQ9FD

我得到:

{
  error: {
    root_cause: [
      {
        type: "index_not_found_exception",
        reason: "no such index",
        resource.type: "index_expression",
        resource.id: "west:error-2019.04",
        index_uuid: "_na_",
        index: "west:error-2019.04"
      }
    ],
    type: "index_not_found_exception",
    reason: "no such index",
    resource.type: "index_expression",
    resource.id: "west:error-2019.04",
    index_uuid: "_na_",
    index: "west:error-2019.04"
  },
  status: 404
}

如果我通过 POST 对http://esmain.example.com:9200/west:error-2019.04/_search?ignore_unavailable=true&size=1&timeout=300000ms进行相同的查询

有了这个身体:

{
    "query": {
        "bool": {
            "must": 
                { "match": { "_id": "M2ywYGoBhIcw2VqxQ9FD" } }
        }
    }
}

我得到正确的记录,没有错误。可以通过 GET 查询驻留在主集群上的记录没有问题(即http://esmain.example.com:9200/error-2019.04/error/rf2P2mkBIndI5iSJGgRd),所以我很确定我的文档类型和语法是正确的.

尽管 POST 是一种变通方法,但我希望能够为开发人员提供易于使用的 URL 而不是 POST 正文,因为它使他们更容易找到错误记录。

标签: elasticsearch

解决方案


跨集群搜索仅用于发送搜索查询(即在_search端点上)而不是 GET 或 DELETE(按 ID)查询,这些查询仍然必须直接在相应的集群上执行。

您可以做的一件事是为您的开发人员提供更简单的无正文搜索查询,例如以下与正文的 POST 完全一样的目的:

GET http://esmain.example.com:9200/west:error-2019.04/_search?q=_id:M2ywYGoBhIcw2VqxQ9FD

推荐阅读