当前位置: 首页 > news >正文

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

---

相关文章:

【Elasticsearch】allow_no_indices

- **allow_no_indices 参数的作用**: 该参数用于控制当请求的目标索引(通过通配符、别名或 _all 指定)不存在或已关闭时,Elasticsearch 的行为。 - **默认行为**: 如果未显式设置该参数,默认值为 …...

54【ip+端口+根目录通信】

上节课讲到,根目录起到定位作用,比如我们搭建一个php网站后,注册系统是由根目录的register.php文件执行,那么我们给这个根目录绑定域名https://127.0.0.1,当我们浏览器访问https://127.0.0.1/register.php时&#xff0…...

python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法

回溯算法 「所有可能的结果」,而不是「结果的个数」,一般情况下,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中,递归用于深入到所有可能的分支&…...

DeepSeek横空出世,AI格局或将改写?

引言 这几天,国产AI大模型DeepSeek R1,一飞冲天,在全球AI圈持续引爆热度,DeepSeek R1 已经是世界上最先进的 AI 模型之一,可与 OpenAI 的新 o1 和 Meta 的 Llama AI 模型相媲美。 DeepSeek-V3模型发布后,在…...

聚簇索引、哈希索引、覆盖索引、索引分类、最左前缀原则、判断索引使用情况、索引失效条件、优化查询性能

聚簇索引 聚簇索引像一本按目录排版的书,用空间换时间,适合读多写少的场景。设计数据库时,主键的选择(如自增ID vs 随机UUID)会直接影响聚簇索引的性能。 什么是聚簇索引? 数据即索引:聚簇索引…...

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用,构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖: 打开终端或命令行,执行以下命令安装 Flask 和 OpenAI SDK: pip i…...

python的pre-commit库的使用

在软件开发过程中,保持代码的一致性和高质量是非常重要的。pre-commit 是一个强大的工具,它可以帮助我们在提交代码到版本控制系统(如 Git)之前自动运行一系列的代码检查和格式化操作。通过这种方式,我们可以确保每次提…...

架构技能(四):需求分析

需求分析,即分析需求,分析软件用户需要解决的问题。 需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。 决定架构的是软件的所有需求吗?肯定不是,真正决定架构…...

Linux环境下的Java项目部署技巧:安装 Nginx

Nginx 的简介: Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP / POP3 / SMTP 代理服务器。它可以作为网站静态资源的 web 服务器,也可以作为其他应用服务器的反向代理服务器。同时, Nginx 还具有负载均衡的功能。 N…...

前端 Vue 性能提升策略

一、引言 前端性能优化是确保 Web 应用快速响应和流畅用户体验的关键。对于使用 Vue.js 构建的应用,性能优化不仅涉及通用的前端技术,还包括针对 Vue 特性的特定优化措施。本文将从多个方面探讨如何全面提升前端和 Vue 应用的性能。 二、前端性能优化基础 1. 减少初始加载…...

深入理解linux中的文件(上)

1.前置知识: (1)文章 内容 属性 (2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中) 如果不打开文件,文件就在磁盘中 (3&am…...

Unity特效插件GodFX

2022Unity安装使用方法​​,将MinDrawer.cs文件MinAttribute改成UnityEngine.PostProcessing.MinAttribute 参考链接: Unity3D特效插件GodFX使用教程_哔哩哔哩_bilibili...

从 C 到 C++:理解结构体中字符串的存储与操作

对于刚入门 C/C 的程序员来说,字符串的存储和操作可能是个容易混淆的知识点。在 C 中,std::string 提供了非常友好的接口,我们可以轻松地在结构体中使用字符串类型,无需关注底层细节。然而,在 C 语言中,字符…...

Linux进阶——时间服务器

NTP是网络时间协议(network time protocol)的简称(应用层的协议),通过UDP123端口进行网络时钟同步。 Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器&#xff08…...

力扣 295. 数据流的中位数

🔗 https://leetcode.cn/problems/find-median-from-data-stream/ 题目 数据流中不断有数添加进来,add 表示添加数据,find 返回数据流中的中位数 思路 大根堆存储数据流中偏小的数据小根堆存储数据流中偏大的数据若当前的 num 比大根堆的…...

【Linux】进程状态和优先级

个人主页~ 进程状态和优先级 一、进程状态1、操作系统进程状态(一)运行态(二)阻塞态(三)挂起态 2、Linux进程状态(一)R-运行状态并发执行 (二)S-浅度睡眠状态…...

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…...

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…...

深入理解开放寻址法中的三种探测序列

一、引言 开放寻址法是解决散列表中冲突的一种重要方法,当发生冲突(即两个不同的键通过散列函数计算得到相同的散列值)时,它会在散列表中寻找下一个可用的存储位置。而探测序列就是用于确定在发生冲突后,依次尝试哪些…...

图像噪声处理技术:让图像更清晰的艺术

在这个数字化时代,图像作为信息传递的重要载体,其质量直接影响着我们的视觉体验和信息解读。然而,在图像采集、传输或处理过程中,难免会遇到各种噪声干扰,如高斯噪声、椒盐噪声等,这些噪声会降低图像的清晰…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...