解析集群 API

编辑

解析指定的索引表达式,返回有关每个集群的信息,包括本地集群(如果包含在内)。

此端点在执行跨集群搜索之前非常有用,可以确定哪些远程集群应包含在搜索中。

您在此端点使用的索引表达式与跨集群搜索使用的索引表达式相同。此端点也支持索引和集群排除

对于索引表达式中的每个集群,将返回以下信息:

  1. 查询(“本地”)集群当前是否连接到索引表达式范围内的每个远程集群
  2. 每个远程集群是否配置了skip_unavailabletruefalse
  3. 该集群上是否有任何与索引表达式匹配的索引、别名或数据流
  4. 当您进行跨集群搜索时,搜索是否可能返回错误(包括如果您的用户没有查询索引的权限,则会出现任何授权错误)
  5. 集群版本信息,包括 Elasticsearch 服务器版本
resp = client.indices.resolve_cluster(
    name="my-index-*,cluster*:my-index-*",
)
print(resp)
response = client.indices.resolve_cluster(
  name: 'my-index-*,cluster*:my-index-*'
)
puts response
const response = await client.indices.resolveCluster({
  name: "my-index-*,cluster*:my-index-*",
});
console.log(response);
GET /_resolve/cluster/my-index-*,cluster*:my-index-*

这将返回有关本地集群和所有以别名cluster*开头的远程配置集群的信息。每个集群将返回有关它是否具有任何与my-index-*匹配的索引、别名或数据流的信息。

请求

编辑

GET /_resolve/cluster/<index_expression>

先决条件

编辑
  • 如果启用了 Elasticsearch 安全功能,您必须对目标数据流、索引或别名具有view_index_metadatareadmanage索引权限

路径参数

编辑
<index_expression>

(必需,字符串)要解析的索引、别名和数据流的逗号分隔的名称或索引模式,使用多目标语法。可以使用<cluster>:<name>语法指定远程集群上的资源。

查询参数

编辑
expand_wildcards

(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以定位数据流,则此参数确定通配符表达式是否匹配隐藏数据流。支持逗号分隔的值,例如open,hidden。有效值为:

all
匹配任何数据流或索引,包括隐藏的数据流或索引。
open
匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
closed
匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流不能关闭。
hidden
匹配隐藏的数据流和隐藏的索引。必须与openclosed或两者结合使用。
none
不接受通配符模式。

默认为open

ignore_unavailable

(可选,布尔值)如果为false,则如果请求的目标是缺失或关闭的索引,则请求将返回错误。默认为false

默认为false

allow_no_indices

(可选,布尔值)如果为false,则如果任何通配符表达式、索引别名_all值仅定位缺失或关闭的索引,则请求将返回错误。即使请求定位其他打开的索引,此行为也适用。例如,如果索引以foo开头,但没有索引以bar开头,则定位foo*,bar*的请求将返回错误。

默认为true

ignore_throttled

(可选,布尔值)如果为true,则在冻结时,将忽略具体的、扩展的或别名的索引。默认为false

[7.16.0] 在 7.16.0 中已弃用。

在跨集群搜索之前使用此端点的优势

编辑

在以下情况下,您可能希望从搜索中排除集群或索引:

  1. 远程集群当前未连接,并且配置了skip_unavailable=false。在这些条件下执行跨集群搜索将导致整个搜索失败
  2. 集群没有与索引表达式匹配的索引、别名或数据流(或者您的用户没有搜索它们的权限)。例如,假设您的索引表达式是logs*,remote1:logs*,并且remote1集群没有与logs*匹配的索引、别名或数据流。在这种情况下,如果您将其包含在跨集群搜索中,则该集群将不会返回任何结果。
  3. 索引表达式(与您指定的任何查询参数组合)可能会在您进行搜索时导致抛出异常。在这些情况下,_resolve/cluster响应中将出现“error”字段。(这也是显示安全/权限错误的地方。)
  4. 远程集群是较旧的版本,不支持您想要在搜索中使用的功能。

示例

编辑
resp = client.indices.resolve_cluster(
    name="my-index*,clust*:my-index*",
)
print(resp)
response = client.indices.resolve_cluster(
  name: 'my-index*,clust*:my-index*'
)
puts response
const response = await client.indices.resolveCluster({
  name: "my-index*,clust*:my-index*",
});
console.log(response);
GET /_resolve/cluster/my-index*,clust*:my-index*

API 返回以下响应

{
  "(local)": {          
    "connected": true,
    "skip_unavailable": false,
    "matching_indices": true,
    "version": {
      "number": "8.13.0",
      "build_flavor": "default",
      "minimum_wire_compatibility_version": "7.17.0",
      "minimum_index_compatibility_version": "7.0.0"
    }
  },
  "cluster_one": {
    "connected": true,         
    "skip_unavailable": true,  
    "matching_indices": true,  
    "version": {
      "number": "8.13.0",      
      "build_flavor": "default",
      "minimum_wire_compatibility_version": "7.17.0",
      "minimum_index_compatibility_version": "7.0.0"
    }
  },
  "cluster_two": {
    "connected": true,
    "skip_unavailable": false,
    "matching_indices": true,
    "version": {
      "number": "8.13.0",
      "build_flavor": "default",
      "minimum_wire_compatibility_version": "7.17.0",
      "minimum_index_compatibility_version": "7.0.0"
    }
  }
}

每个集群都有其自己的响应部分。您向其发送请求的集群标记为“(local)”。

查询集群尝试向每个远程集群发出请求。如果成功,则connected=true

在本地集群上配置的每个远程集群的skip_unavailable设置。

指示是否有任何索引、别名或数据流与为该集群指定的索引表达式匹配。

Elasticsearch 服务器版本。

识别跨集群搜索的潜在问题

编辑

以下请求显示了如何通过修改查询来防止搜索失败的几个示例。

resp = client.indices.resolve_cluster(
    name="not-present,clust*:my-index*,oldcluster:*",
    ignore_unavailable=False,
)
print(resp)
response = client.indices.resolve_cluster(
  name: 'not-present,clust*:my-index*,oldcluster:*',
  ignore_unavailable: false
)
puts response
const response = await client.indices.resolveCluster({
  name: "not-present,clust*:my-index*,oldcluster:*",
  ignore_unavailable: "false",
});
console.log(response);
GET /_resolve/cluster/not-present,clust*:my-index*,oldcluster:*?ignore_unavailable=false
{
  "(local)": {
    "connected": true,
    "skip_unavailable": false,
    "error": "no such index [not_present]"  
  },
  "cluster_one": {
    "connected": true,
    "skip_unavailable": true,
    "matching_indices": false,    
    "version": {
      "number": "8.13.0",
      "build_flavor": "default",
      "minimum_wire_compatibility_version": "7.17.0",
      "minimum_index_compatibility_version": "7.0.0"
    }
  },
  "cluster_two": {
    "connected": false,           
    "skip_unavailable": false,
    "matching_indices": true,
    "version": {
      "number": "8.13.0",
      "build_flavor": "default",
      "minimum_wire_compatibility_version": "7.17.0",
      "minimum_index_compatibility_version": "7.0.0"
    }
  },
  "oldcluster": {         
    "connected": true,
    "skip_unavailable": false,
    "matching_indices": true
  }
}

本地集群没有名为not_present的索引。使用指定的ignore_unavailable=false参数对其进行搜索将返回“no such index”错误。此处也会显示其他类型的错误,例如当用户没有搜索指定索引的授权时,会出现安全权限错误。

cluster_one远程集群没有与模式my-index*匹配的索引。可能没有与该模式匹配的索引,或者该索引可能已关闭。(您可以使用解析索引API 来检查这一点。)

cluster_two远程集群未连接(连接尝试失败)。由于此集群标记为skip_unavailable=false,您应该通过将-cluster_two:*添加到搜索索引表达式中来将此集群从搜索中排除。

oldcluster远程集群表明它具有匹配的索引,但未包含版本信息。这表示该集群的版本早于 8.13.0 中引入_resolve/cluster API,因此您可能希望将其从跨集群搜索中排除。(注意:该端点能够知道存在匹配的索引,因为它回退到使用解析索引API。)