【Elasticsearch】allow_no_indices

- **`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`**:控制当目标索引不存在或关闭时是否返回错误。

---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例

注:本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者: Lewis Cowles 译者: LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…

JVM 四虚拟机栈

虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多…

排序算法与查找算法

1.十大经典排序算法 我们希望数据以一种有序的形式组织起来&#xff0c;无序的数据我们要尽量将其变得有序 一般说来有10种比较经典的排序算法 简单记忆为Miss D----D小姐 时间复杂度 &#xff1a;红色<绿色<蓝色 空间复杂度&#xff1a;圆越大越占空间 稳定性&…

Spring理论知识(Ⅴ)——Spring Web模块

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 Spring Web模块简介 众所周知&#xff0c;Java目前最大的一个用途就是作为Web应用的服务端&#xff08;Java Web&#xff09; Spring又是JavaEE中使用最广泛的开发框架&#xff0…

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…

车载软件架构 --- 软件定义汽车面向服务架构的应用迁移

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

【简介】除了单位用户以外&#xff0c;大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙&#xff0c;固件无法达到目前最高版本7.6&#xff0c;这里以最常用的60E为例&#xff0c;演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多&#xff0c;文章分上、下…

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…

OpenEuler学习笔记(十六):搭建postgresql高可用数据库环境

以下是在OpenEuler系统上搭建PostgreSQL高可用数据环境的一般步骤&#xff0c;通常可以使用流复制&#xff08;Streaming Replication&#xff09;或基于Patroni等工具来实现高可用&#xff0c;以下以流复制为例&#xff1a; 安装PostgreSQL 配置软件源&#xff1a;可以使用O…

机器学习--2.多元线性回归

多元线性回归 1、基本概念 1.1、连续值 1.2、离散值 1.3、简单线性回归 1.4、最优解 1.5、多元线性回归 2、正规方程 2.1、最小二乘法 2.2、多元一次方程举例 2.3、矩阵转置公式与求导公式 2.4、推导正规方程0的解 2.5、凸函数判定 成年人最大的自律就是&#xff1a…

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编&#xff0c;编译后链接即可) 任务1&#xff1a;Uthread: switching between threads (完成) 在这个练习中&#xff0c;你将设计一个用户级线程系统中的上下文切…

AWS配置邮件服务器给其他邮箱发邮件的方法

一、前言 公司系统用AWS平台的邮件服务器&#xff0c;如果想给新收件人发邮件&#xff0c;就需要特殊配置下才行&#xff1b;不然发不出去。 二、步骤 1.登录AWS平台&#xff0c;登录地址&#xff08;藏的很深&#xff0c;不太好搜到&#xff0c;参数也不能删&#xff09; …

kaggle视频行为分析1st and Future - Player Contact Detection

这次比赛的目标是检测美式橄榄球NFL比赛中球员经历的外部接触。您将使用视频和球员追踪数据来识别发生接触的时刻&#xff0c;以帮助提高球员的安全。两种接触&#xff0c;一种是人与人的&#xff0c;另一种是人与地面&#xff0c;不包括脚底和地面的&#xff0c;跟我之前做的这…

42【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式&#xff0c;由于跨域资源共享(cors)是浏览器的一种安全机制&#xff0c;它会阻止前端应用…

JVM执行流程与架构(对应不同版本JDK)

直接上图&#xff08;对应JDK8以及以后的HotSpot&#xff09; 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭&#xff1a; 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间&#xff0c;堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…

【玩转 Postman 接口测试与开发2_014】第11章:测试现成的 API 接口(下)——自动化接口测试脚本实战演练 + 测试集合共享

《API Testing and Development with Postman》最新第二版封面 文章目录 3 接口自动化测试实战3.1 测试环境的改造3.2 对列表查询接口的测试3.3 对查询单个实例的测试3.4 对新增接口的测试3.5 对修改接口的测试3.6 对删除接口的测试 4 测试集合的共享操作4.1 分享 Postman 集合…

登录认证(5):过滤器:Filter

统一拦截 上文我们提到&#xff08;登录认证&#xff08;4&#xff09;&#xff1a;令牌技术&#xff09;&#xff0c;现在大部分项目都使用JWT令牌来进行会话跟踪&#xff0c;来完成登录功能。有了JWT令牌可以标识用户的登录状态&#xff0c;但是完整的登录逻辑如图所示&…

基于Spring Security 6的OAuth2 系列之七 - 授权服务器--自定义数据库客户端信息

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

git基础使用--1--版本控制的基本概念

文章目录 git基础使用--1--版本控制的基本概念1.版本控制的需求背景&#xff0c;即为啥需要版本控制2. 集中式版本控制SVN3. 分布式版本控制 Git4. SVN和Git的比较 git基础使用–1–版本控制的基本概念 1.版本控制的需求背景&#xff0c;即为啥需要版本控制 先说啥叫版本&…