现在c 做网站用什么框架,网站续费服务商,重庆市建设医院网站首页,小程序在线开发- **allow_no_indices 参数的作用**#xff1a; 该参数用于控制当请求的目标索引#xff08;通过通配符、别名或 _all 指定#xff09;不存在或已关闭时#xff0c;Elasticsearch 的行为。
- **默认行为**#xff1a; 如果未显式设置该参数#xff0c;默认值为 …- **allow_no_indices 参数的作用** 该参数用于控制当请求的目标索引通过通配符、别名或 _all 指定不存在或已关闭时Elasticsearch 的行为。
- **默认行为** 如果未显式设置该参数默认值为 true即允许请求的目标索引不存在或关闭不会返回错误。
- **设置为 false 时的行为** 如果设置为 falseElasticsearch 会严格检查请求的目标索引。如果发现任何通配符、别名或 _all 值仅匹配到缺失或关闭的索引请求将返回错误。即使请求中同时指定了其他存在的开放索引只要有一部分目标索引不存在或关闭就会触发错误。
- **适用场景** 该参数适用于需要确保请求的目标索引必须存在的场景。例如在某些业务逻辑中如果目标索引不存在或关闭可能意味着数据不完整或配置错误此时可以通过设置 allow_no_indices 为 false 来快速发现问题。
- **示例说明** 假设有以下索引 - foo1存在且开放 - foo2存在且开放 - bar1不存在或关闭 如果发送一个请求目标索引为 foo*,bar*并且 allow_no_indices 设置为 falseElasticsearch 会检查 foo* 和 bar* 的匹配情况。由于 foo* 匹配到 foo1 和 foo2存在且开放但 bar* 没有匹配到任何存在的开放索引因此请求会返回错误。就是说有多个通配符去匹配只要有一个通配符没有匹配到任何开放的索引就会报错
使用 _all 搜索时
GET /_all/_search?allow_no_indicesfalse
**allow_no_indicesfalse 是否触发错误取决于集群中是否存在至少一个开放的索引**。以下是具体场景分析
---
### **1. 当集群中存在至少一个开放的索引时** - **行为**: 如果集群中存在至少一个开放的索引例如 logs-2023-10即使其他索引不存在或已关闭使用 _all 搜索时 **不会报错**。 **原因**: _all 的作用是匹配所有存在的索引包括别名和数据流。只要集群中存在至少一个开放的索引_all 就能成功匹配到因此 allow_no_indicesfalse 不会触发错误。
- **示例**: 假设集群中存在以下索引 - logs-2023-10开放 - metrics-2023-10关闭 执行以下搜索 json GET /_all/_search?allow_no_indicesfalse { query: { match_all: {} } } **结果**: - 搜索会成功因为 _all 匹配到了 logs-2023-10开放的索引。 - 关闭的索引 metrics-2023-10 会被忽略但不会触发错误。
---
### **2. 当集群中没有任何开放的索引时** - **行为**: 如果集群中所有索引都关闭或不存在使用 _all 搜索且 allow_no_indicesfalse 时**会触发错误**。 **原因**: _all 无法匹配到任何开放的索引因此 allow_no_indicesfalse 会强制要求至少有一个索引存在否则报错。
- **示例**: 假设集群中只有 metrics-2023-10关闭执行以下搜索 json GET /_all/_search?allow_no_indicesfalse { query: { match_all: {} } } **结果**: 返回错误 json { error: { root_cause: [ { type: index_not_found_exception, reason: no index matches [_all] } ] } }
---
### **关键结论** - **allow_no_indicesfalse 的语义**: 它要求 **至少有一个索引存在且开放**通过通配符、别名或 _all 匹配到。 如果没有任何索引匹配则触发错误。
- **_all 的特殊性**: _all 的作用是匹配所有存在的开放索引。只要集群中存在至少一个开放索引_all 就能成功匹配**即使其他索引不存在或关闭**。
---
### **总结** | 场景 | 是否触发错误 | 原因 | |------|--------------|------| | 集群中存在至少一个开放索引 | ❌ 不触发错误 | _all 匹配到了开放的索引 | | 集群中所有索引关闭或不存在 | ✔️ 触发错误 | _all 未匹配到任何开放索引 |
因此只有在集群中完全无索引或所有索引关闭时_all allow_no_indicesfalse 才会触发错误。其他情况下只要存在至少一个开放的索引请求会正常执行。
**通配符匹配时**
是否报错取决于以下两个条件
1. **通配符是否匹配到至少一个开放的索引** 2. **allow_no_indices 参数的设置**
---
### **1. 默认行为allow_no_indicestrue** - **不会报错**即使通配符未匹配到任何索引请求也会成功返回空结果或无操作。 - **示例** 假设集群中存在开放索引 logs-2023但通配符 nonexistent-* 未匹配到任何索引 json GET /nonexistent-*/_search?allow_no_indicestrue **结果**返回空结果不会报错。
---
### **2. 当 allow_no_indicesfalse 时** - **是否报错取决于通配符的匹配情况** - **场景 1**通配符 **匹配到至少一个开放索引** **结果**✅ 不报错。 **示例** json GET /logs-*/_search?allow_no_indicesfalse 假设 logs-2023 是开放的请求成功。 - **场景 2**通配符 **未匹配到任何开放索引** **结果**❌ 报错。 **示例** json GET /nonexistent-*/_search?allow_no_indicesfalse 返回错误no index matches pattern [nonexistent-*]。
---
### **3. 通配符包含多个部分时的行为** 如果请求目标是多个通配符例如 logs-*,metrics-* - **任一通配符未匹配到开放索引**会触发错误allow_no_indicesfalse 时。 - **所有通配符均匹配到至少一个开放索引**不会报错。
**示例** json GET /logs-*,metrics-*/_search?allow_no_indicesfalse - 若 logs-* 匹配到开放索引但 metrics-* 未匹配到任何索引 **结果**❌ 报错因为 metrics-* 未匹配到。 - 若 logs-* 和 metrics-* 均匹配到开放索引 **结果**✅ 成功。
---
### **总结** | 条件 | allow_no_indicesfalse 时的行为 | |------|----------------------------------| | 通配符匹配到至少一个开放索引 | ✅ 成功 | | 通配符未匹配到任何开放索引 | ❌ 报错 | | 多通配符中部分未匹配到开放索引 | ❌ 报错 |
---
### **关键结论** - **集群中存在开放索引 ≠ 通配符一定能匹配到索引** 即使集群中有其他开放索引如果通配符未匹配到它们仍可能报错。 - **通配符的精确匹配是关键** 需确保通配符模式能覆盖到目标索引例如 logs-* 匹配 logs-2023。
在 Elasticsearch 中**别名**和 **_all** 是用于简化索引操作的特性。以下是它们的例子和解释
---
### **1. 别名Alias的例子**
别名是一个指向一个或多个索引的虚拟名称。通过别名可以更方便地操作索引而无需直接使用索引名称。
#### **例子** 假设有两个索引 - logs-2023-10-01 - logs-2023-10-02
你可以为这两个索引创建一个别名 current-logs然后通过别名来查询或操作这两个索引。
#### **创建别名** json POST /_aliases { actions: [ { add: { index: logs-2023-10-01, alias: current-logs } }, { add: { index: logs-2023-10-02, alias: current-logs } } ] }
#### **使用别名查询** json GET /current-logs/_search { query: { match_all: {} } } 这个查询会同时搜索 logs-2023-10-01 和 logs-2023-10-02 两个索引。
---
### **2. _all 值的例子**
_all 是一个特殊的值表示搜索所有索引包括数据流和别名。它通常用于全局搜索。
#### **例子** 假设有以下索引 - logs-2023-10-01 - metrics-2023-10-01 - users
你可以使用 _all 来搜索所有索引中的数据。
#### **使用 _all 查询** json GET /_all/_search { query: { match: { message: error } } } 这个查询会在 logs-2023-10-01、metrics-2023-10-01 和 users 中搜索包含 error 的文档。
---
### **结合 allow_no_indices 的例子**
假设有以下索引 - logs-2023-10-01存在且开放 - logs-2023-10-02关闭 - metrics-2023-10-01存在且开放
#### **场景 1allow_no_indices 为 true默认** json GET /logs-2023-10-02,metrics-2023-10-01/_search { query: { match_all: {} } } - 即使 logs-2023-10-02 是关闭的索引请求也不会返回错误。 - 搜索结果仅包含 metrics-2023-10-01 中的数据。
#### **场景 2allow_no_indices 为 false** json GET /logs-2023-10-02,metrics-2023-10-01/_search { query: { match_all: {} } } - 由于 logs-2023-10-02 是关闭的索引请求会返回错误。 - 即使 metrics-2023-10-01 是存在的开放索引请求也会失败。
#### **场景 3使用 _all 和 allow_no_indices** json GET /_all/_search { query: { match_all: {} } } - 如果集群中没有任何索引且 allow_no_indices 为 false请求会返回错误。 - 如果 allow_no_indices 为 true请求会成功但返回空结果。
---
### **总结** - **别名**用于简化对多个索引的操作。 - **_all**用于搜索所有索引。 - **allow_no_indices**控制当目标索引不存在或关闭时是否返回错误。
---