Elasticsearch index 设置 false,为什么还可以被检索到?
在 Elasticsearch 中,mapping 定义了索引中的字段类型及其处理方式。
近期有球友提问,为什么设置了 index: false 的字段仍能被检索。
本文将详细探讨这个问题,并引入列式存储的概念,帮助大家更好地理解 Elasticsearch 的存储和查询机制。
1、问题描述
我们创建了一个名为 my-index-000001 的索引,并为其添加了一个名为 employee-id 的字段,该字段的 index 属性被设置为 false。
按理说,这个字段不应该被索引,也不应能被检索,但在执行查询时,却能检索到该字段。这是为什么呢?
PUT /my-index-000001
{"mappings": {"properties": {"employee-id": {"type": "keyword","index": false}}}
}POST /my-index-000001/_doc/1
{"employee-id": "1111"
}POST /my-index-000001/_search
{"query": {"term": {"employee-id": "1111"}}
}
问题来源:https://t.zsxq.com/GuwKP
2、原因分析
在 Elasticsearch 中,index 选项控制字段值是否被索引。
默认情况下,所有字段都是被索引的 (index: true)。当 index 设置为 false 时,字段不会被索引,因此不能通过常规查询方法高效地检索该字段。
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index.html
然而,对于某些特定类型的字段,即使设置了 index: false,它们仍然可以通过 doc_values 进行查询。
这其实就是咱们的问题所在!
这些特定字段类型包括:
数值类型(Numeric types)
日期类型(Date types)
布尔类型(Boolean type)
IP 类型(IP type)
地理点类型(Geo_point type)
关键字类型(Keyword type)
对于这些类型的字段,即使 index 设置为 false,只要 doc_values 启用,它们仍然可以被查询。
查询效率会较低,因为需要对整个索引进行全扫描(full scan)。
3、列式存储概述
列式存储(Columnar Storage)是指将每个字段的数据独立存储,这种存储方式不同于传统的行式存储。
在数据仓库和大数据处理系统中,列式存储优化了读取和分析操作。
以下是一些常见的列式存储格式及其应用:
Parquet:广泛用于 Apache Hadoop 生态系统中的数据处理,提供高效的存储和压缩。
ORC(Optimized Row Columnar):主要用于 Apache Hive 和 Hadoop 生态系统,提供优化的列存储格式。
Cassandra:分布式数据库系统,采用行和列的混合存储方式,支持列级别的高效查询。
列式存储 VS 行式存储
在 Elasticsearch 中,doc_values 是一种列式存储机制,用于存储字段的数据,以支持高效的排序和聚合操作。
这里就是明显区别于“倒排索引”的一种正排索引技术,详细解读参见《一本书讲透 Elasticsearch》P97-P98。
Doc values 是指在文档索引时创建的存储在磁盘数据结构,它们以列式存储的方式保存与 _source 相同的数据,从而大大提高了排序和聚合操作的效率。除文本 text 和带注释的文本(annotated_text ,新类型)字段外,几乎所有字段类型都支持 doc values。
https://www.elastic.co/guide/en/elasticsearch/reference/current/doc-values.html
3.1 列式存储示例:词组数据举例
假设我们有以下文档集合,这些文档包含多个字段,包括 employee-id 雇员 id 序号和 address 地址信息:
[{"employee-id": "1111", "name": "Alice", "age": 30, "address": "123 Main St, Springfield, IL"},{"employee-id": "1112", "name": "Bob", "age": 25, "address": "456 Elm St, Springfield, IL"},{"employee-id": "1113", "name": "Charlie", "age": 35, "address": "789 Oak St, Springfield, IL"}
]
列式存储如下图所示:
当这些文档被索引到 Elasticsearch 中时,启用了 doc_values 的字段会以列式存储的方式独立存储。
假设我们为 employee-id、address 字段启用了 doc_values,其存储结构如下:
employee-id 列存储:
"1111"
"1112"
"1113"
address 列存储:
"123 Main St, Springfield, IL"
"456 Elm St, Springfield, IL"
"789 Oak St, Springfield, IL"
3.2 列式存储查询行为
回到开篇问题,在这种情况下,如果我们对 employee-id 进行查询:
POST /my-index/_search
{"profile": true, "query": {"term": {"employee-id": "1111"}}
}
由于 employee-id 字段启用了 doc_values,但没有被索引,Elasticsearch 会使用基于 doc_values 的查询机制来处理。
这个查询会遍历 employee-id 列的数据,找到匹配 "1111" 的文档。
这里就分析出了 index:false, 依然可以被检索的原因。
再进一步验证,
PUT /my-index-0606
{"mappings": {"properties": {"employee-id": {"type": "keyword","doc_values": true},"name": {"type": "text"},"age": {"type": "integer","doc_values": true},"address": {"type": "keyword","index":false}}}
}POST /my-index-0606/_bulk
{ "index": { "_id": "1" } }
{ "employee-id": "1111", "name": "Alice", "age": 30, "address": "123 Main St, Springfield, IL" }
{ "index": { "_id": "2" } }
{ "employee-id": "1112", "name": "Bob", "age": 25, "address": "456 Elm St, Springfield, IL" }
{ "index": { "_id": "3" } }
{ "employee-id": "1113", "name": "Charlie", "age": 35, "address": "789 Oak St, Springfield, IL" }POST my-index-0606/_search
{"query": {"term": {"address": "123 Main St, Springfield, IL"}}
}
得到结果如下:
这就是基于正排索引做的轮询的结果。
3.3 列式存储的优势和劣势
优势:
列式存储使得对特定字段的聚合和排序操作更加高效,因为只需要读取相关列的数据,而不是整个文档的所有字段。
举例说明,假设我们有一个包含员工信息的索引(在之前基础上新增了字段),文档结构如下:
[{"employee-id": "1111", "name": "Alice", "age": 30, "salary": 5000, "address": "123 Main St, Springfield, IL"},{"employee-id": "1112", "name": "Bob", "age": 25, "salary": 6000, "address": "456 Elm St, Springfield, IL"},{"employee-id": "1113", "name": "Charlie", "age": 35, "salary": 7000, "address": "789 Oak St, Springfield, IL"}
]
如果行式存储:读取每个文档时,所有字段数据都被加载,即使我们只关心其中一个字段的数据。
行式存储举例——计算平均薪资时,整个文档(包括 name、age、address 等)都要被读取。如下图所示:
读取整行信息,有点类似 MySQL 如下操作:
SELECT * FROM employees WHERE employee-id = '1111';
返回结果:
{"employee-id": "1111", "name": "Alice", "age": 30, "salary": 5000, "address": "123 Main St, Springfield, IL"}
如果列式存储:只读取特定字段的数据。
列式存储举例——计算平均薪资时,只需读取 salary 列的数据即可,避免了读取无关字段的数据。如下图所示。
列式存储读取一列数据,有点类似 MySQL如下操作:
SELECT age FROM employees;
返回结果:
[30, 25, 35]
劣势:对于未被索引的字段,查询效率较低,因为需要遍历整个列的数据来匹配查询条件。
4、结论
通过这些示例,我们可以更清楚地理解 Elasticsearch 中列式存储和 doc_values 的应用。
列式存储使得对特定字段的聚合和排序操作更加高效,但对于未被索引的字段,查询效率较低,因为需要遍历整个列的数据来匹配查询条件。
希望这些解释能帮助你更好地理解 Elasticsearch 的存储和查询机制。
如果你对字段的查询和聚合有特定需求,合理使用 index 和 doc_values 设置可以大大提升性能和效率。
新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路
更短时间更快习得更多干货!
和全球超2000+ Elastic 爱好者一起精进!
elastic6.cn——ElasticStack进阶助手
比同事抢先一步学习进阶干货!
相关文章:

Elasticsearch index 设置 false,为什么还可以被检索到?
在 Elasticsearch 中,mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问,为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题,并引入列式存储的概念,帮助大家更好地理解 Elasticsearch 的存储和查…...

169. 多数元素
题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3]输出:3 …...

ADS基础教程19 - 电磁仿真(EM)基本概念和实操
EM介绍 一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍 三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip(微带线)3.添加Substrate4.Momentum仿真 四、总结 一、引言 本章节开始介绍EM的基本概念、内容以及实现具体…...

LabVIEW RT环境中因字符串拼接导致的系统崩溃问题
在LabVIEW实时操作系统(RT)环境中运行的应用程序出现字符串拼接后死机的问题,通常涉及内存管理、内存泄漏或其他资源管理问题。以下是一些指导和步骤,帮助解决这个问题: 1. 内存泄漏检测 字符串拼接会在内存中创建新…...

深层网络:层数多真的更好吗?
深层网络:层数多真的更好吗? 在深度学习的世界里,"深度"始终是一个热门话题。随着技术的发展,我们有了越来越多的方法来构建更深的神经网络,这似乎暗示着“层数越多,效果越好”。然而࿰…...

【QT5】<知识点> QT常用知识(更新中)
目录 一、更改文本颜色和格式 二、QT容器类 三、字符串与整数、浮点数之间的转换 四、QString常用功能 五、SpinBox的属性介绍 六、滑动、滚动、进度条和表盘LCD 七、时间、日期、定时器 一、更改文本颜色和格式 动态设置字体粗体:QFont对象的setBold方法动态…...

如何将AndroidStudio和IDEA的包名改为分层级目录
新版UIAndroidStudio 1、点击项目目录右上角如图所示的三个点点。 2、然后依次取消Hide empty middle package ,Flatten package的勾选 3、注意:一定要先取消hide的勾选,不然目录不会完全分级(做错了可以反过来重新设置&#x…...

北交字节联合提出ClassDiffusion: 使用显式类别引导的一致性个性化生成。
在个性化生成领域, 微调可能会引起过拟合导致模型无法生成与提示词一致的结果。针对这个问题,北交&字节联合提出ClassDiffusion,来提升个性化生成的一致性。 通过两个重要观察及理论分析提出了新的观点:一致性的损失是个性化概念语义偏移导致的, 还…...
37、matlab矩阵运算
1、前言 矩阵运算是指对矩阵的各种操作和运算,包括矩阵加法、矩阵减法、矩阵乘法、矩阵转置、求逆矩阵等。以下是常见的矩阵运算: 矩阵加法:对应位置的元素相加,要求加数和被加数的维度相同。 A B | a11 b11 | | a12 b12 | | …...
用软件实现的硬件——虚拟机
通过软件实现CPU和内存等硬件所具有的功能,并在计算机中运行循环的计算机技术称为虚拟机。使用虚拟机,就可以在一台计算机中运行多个循环出来的计算机。 近几年的计算机,除了硬件具有较高的性能外,CPU的性能也有了提升。因此&…...

[Shell编程学习路线]--shell中重定向和管道符(详细介绍)
🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月12日10点50分 🀄️文章质量:93分 ——前言—— 在Shell编程中,重定向和管道符是两个…...

Linux命令详解(1)
在Linux操作系统中,命令行界面(CLI)是一个强大的工具,它允许用户通过键入命令来与系统交互。无论是系统管理员还是普通用户,掌握一些基本的Linux命令都是非常重要的。在本文中,我们将探讨一些常用的Linux命…...

网工内推 | 深信服、中软国际技术支持工程师,最高13k*13薪
01 深信服 🔷招聘岗位:远程技术支持工程师 🔷任职要求: 一、专业能力和行业经验: ①具备友商同岗位工作经验1.5年以上,具备良好的分析和判断能力,有独立问题处理思路,具备常见协…...
实现卡片的展开缩放动画
原理,外层包裹一个元素,子元素分别是展开和收起的元素,然后对展开的元素添加动画,动画内容是随时间变化,将卡片的transform:rotateX属性进行调整,因为改变的是子元素的旋转,父元素高…...
实验:贪心算法
实验二:贪心算法 【实验目的】 应用贪心算法求解活动安排问题。 【实验性质】 验证性实验。 【实验要求】 活动安排问题是可以用贪心算法有效求解的很好的例子。 问题:有n个活动的集合A{1,2,…,n},其中每个活动都要求使用同一资源&…...
Python学习笔记12 -- 有关布尔值的详细说明
一、布尔表达式 最终值为true 或者false 二、常见形式: 1、常量:true false 2、比较运算: and ! 3、复合运算: and and or 4、其他 例:检测闰年: def specialYearMine(year):if (year%4 …...
SQL-窗口函数合集
目录 1.窗口函数简介2.窗口的定义3.相关题目示例3.1 PERCENT_RANK()2346 以百分比计算排名 3.2 FIRST_VALUE()/LAST_VALUE()/NTH_VALUE()2388 将表中的空值更改为前一个值 1.窗口函数简介 MySQL 开窗函数(Window Functions)是 MySQL 8.0 版本引入的一个…...

2024 全球软件研发技术大会官宣,50+专家共话软件智能新范式!
2024年的全球软件研发技术大会(SDCon)由CSDN和高端IT咨询与教育平台Boolan联合主办,将于7月4日至5日在北京威斯汀酒店举行。本次大会的主题为“大模型驱动软件智能化新范式”,旨在探讨大模型和开源技术的发展如何引领全球软件研发…...

opencv快速安装以及各种查看版本命令
安装opencv并查看其版本,直接通过一个可执行文件实现。 #!/bin/bashwget https://codeload.github.com/opencv/opencv/zip/3.4 -O opencv-3.4.zip && unzip opencv-3.4.zip && cd opencv-3.4 && \mkdir build && cd build &&a…...

免费学习通刷课(免费高分)Pro版
文章目录 概要整体架构流程小结 概要 关于上一版的免费高分的学习通刷课,有很多人觉得还得登录太复杂了,然后我又发现了个神脚本,操作简单,可以后台挂着,但是还是建议调整速度到2倍速,然后找到你该刷的课&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...