教做年糕博客网站永久网站建设教程
- **`allow_no_indices` 参数的作用**:  
   该参数用于控制当请求的目标索引(通过通配符、别名或 `_all` 指定)不存在或已关闭时,Elasticsearch 的行为。
- **默认行为**:  
   如果未显式设置该参数,默认值为 `true`,即允许请求的目标索引不存在或关闭,不会返回错误。
- **设置为 `false` 时的行为**:  
   如果设置为 `false`,Elasticsearch 会严格检查请求的目标索引。如果发现任何通配符、别名或 `_all` 值仅匹配到缺失或关闭的索引,请求将返回错误。即使请求中同时指定了其他存在的开放索引,只要有一部分目标索引不存在或关闭,就会触发错误。
- **适用场景**:  
   该参数适用于需要确保请求的目标索引必须存在的场景。例如,在某些业务逻辑中,如果目标索引不存在或关闭,可能意味着数据不完整或配置错误,此时可以通过设置 `allow_no_indices` 为 `false` 来快速发现问题。
- **示例说明**:  
   假设有以下索引:  
   - `foo1`(存在且开放)  
   - `foo2`(存在且开放)  
   - `bar1`(不存在或关闭)  
如果发送一个请求,目标索引为 `foo*,bar*`,并且 `allow_no_indices` 设置为 `false`,Elasticsearch 会检查 `foo*` 和 `bar*` 的匹配情况。由于 `foo*` 匹配到 `foo1` 和 `foo2`(存在且开放),但 `bar*` 没有匹配到任何存在的开放索引,因此请求会返回错误。(就是说有多个通配符去匹配,只要有一个通配符没有匹配到任何开放的索引,就会报错)
使用 `_all` 搜索时
GET /_all/_search?allow_no_indices=false
,**`allow_no_indices=false` 是否触发错误取决于集群中是否存在至少一个开放的索引**。以下是具体场景分析:
---
### **1. 当集群中存在至少一个开放的索引时**
 - **行为**:  
   如果集群中存在至少一个开放的索引(例如 `logs-2023-10`),即使其他索引不存在或已关闭,使用 `_all` 搜索时 **不会报错**。  
   **原因**:  
   `_all` 的作用是匹配所有存在的索引(包括别名和数据流)。只要集群中存在至少一个开放的索引,`_all` 就能成功匹配到,因此 `allow_no_indices=false` 不会触发错误。
- **示例**:  
   假设集群中存在以下索引:  
   - `logs-2023-10`(开放)  
   - `metrics-2023-10`(关闭)  
  执行以下搜索:  
   ```json
   GET /_all/_search?allow_no_indices=false
   { 
     "query": { 
       "match_all": {}
     }
   }
   ```
   **结果**:  
   - 搜索会成功,因为 `_all` 匹配到了 `logs-2023-10`(开放的索引)。  
   - 关闭的索引 `metrics-2023-10` 会被忽略,但不会触发错误。
---
### **2. 当集群中没有任何开放的索引时**
 - **行为**:  
   如果集群中所有索引都关闭或不存在,使用 `_all` 搜索且 `allow_no_indices=false` 时,**会触发错误**。  
   **原因**:  
   `_all` 无法匹配到任何开放的索引,因此 `allow_no_indices=false` 会强制要求至少有一个索引存在,否则报错。
- **示例**:  
   假设集群中只有 `metrics-2023-10`(关闭),执行以下搜索:  
   ```json
   GET /_all/_search?allow_no_indices=false
   { 
     "query": { 
       "match_all": {}
     }
   }
   ```
   **结果**:  
   返回错误:  
   ```json
   { 
     "error": { 
       "root_cause": [
         { 
           "type": "index_not_found_exception",
           "reason": "no index matches [_all]"
         }
       ]
     }
   }
   ```
---
### **关键结论**
 - **`allow_no_indices=false` 的语义**:  
   它要求 **至少有一个索引存在且开放**(通过通配符、别名或 `_all` 匹配到)。  
   如果没有任何索引匹配,则触发错误。
- **`_all` 的特殊性**:  
   `_all` 的作用是匹配所有存在的开放索引。只要集群中存在至少一个开放索引,`_all` 就能成功匹配,**即使其他索引不存在或关闭**。
---
### **总结**
 | 场景 | 是否触发错误 | 原因 |
 |------|--------------|------|
 | 集群中存在至少一个开放索引 | ❌ 不触发错误 | `_all` 匹配到了开放的索引 |
 | 集群中所有索引关闭或不存在 | ✔️ 触发错误 | `_all` 未匹配到任何开放索引 |
因此,只有在集群中完全无索引(或所有索引关闭)时,`_all + allow_no_indices=false` 才会触发错误。其他情况下,只要存在至少一个开放的索引,请求会正常执行。
**通配符匹配时**
是否报错取决于以下两个条件:
1. **通配符是否匹配到至少一个开放的索引**  
 2. **`allow_no_indices` 参数的设置**  
---
### **1. 默认行为(`allow_no_indices=true`)**
 - **不会报错**:即使通配符未匹配到任何索引,请求也会成功(返回空结果或无操作)。  
 - **示例**:  
   假设集群中存在开放索引 `logs-2023`,但通配符 `nonexistent-*` 未匹配到任何索引:  
   ```json
   GET /nonexistent-*/_search?allow_no_indices=true
   ```
   **结果**:返回空结果,不会报错。
---
### **2. 当 `allow_no_indices=false` 时**
 - **是否报错取决于通配符的匹配情况**:  
   - **场景 1**:通配符 **匹配到至少一个开放索引**  
     **结果**:✅ 不报错。  
     **示例**:  
     ```json
     GET /logs-*/_search?allow_no_indices=false
     ```  
     假设 `logs-2023` 是开放的,请求成功。  
  - **场景 2**:通配符 **未匹配到任何开放索引**  
     **结果**:❌ 报错。  
     **示例**:  
     ```json
     GET /nonexistent-*/_search?allow_no_indices=false
     ```  
     返回错误:`no index matches pattern [nonexistent-*]`。
---
### **3. 通配符包含多个部分时的行为**
 如果请求目标是多个通配符(例如 `logs-*,metrics-*`):  
 - **任一通配符未匹配到开放索引**:会触发错误(`allow_no_indices=false` 时)。  
 - **所有通配符均匹配到至少一个开放索引**:不会报错。  
**示例**:  
 ```json
 GET /logs-*,metrics-*/_search?allow_no_indices=false
 ```
 - 若 `logs-*` 匹配到开放索引,但 `metrics-*` 未匹配到任何索引:  
   **结果**:❌ 报错(因为 `metrics-*` 未匹配到)。  
 - 若 `logs-*` 和 `metrics-*` 均匹配到开放索引:  
   **结果**:✅ 成功。
---
### **总结**
 | 条件 | `allow_no_indices=false` 时的行为 |
 |------|----------------------------------|
 | 通配符匹配到至少一个开放索引 | ✅ 成功 |
 | 通配符未匹配到任何开放索引 | ❌ 报错 |
 | 多通配符中部分未匹配到开放索引 | ❌ 报错 |
---
### **关键结论**
 - **集群中存在开放索引 ≠ 通配符一定能匹配到索引**:  
   即使集群中有其他开放索引,如果通配符未匹配到它们,仍可能报错。
 - **通配符的精确匹配是关键**:  
   需确保通配符模式能覆盖到目标索引(例如 `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`(存在且开放)
#### **场景 1:`allow_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` 中的数据。
#### **场景 2:`allow_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`**:控制当目标索引不存在或关闭时是否返回错误。
---
