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

Elasticsearch index 设置 false,为什么还可以被检索到?

在 Elasticsearch 中,mapping 定义了索引中的字段类型及其处理方式。

近期有球友提问,为什么设置了 index: false 的字段仍能被检索。

本文将详细探讨这个问题,并引入列式存储的概念,帮助大家更好地理解 Elasticsearch 的存储和查询机制。

4973d4144bbbe9b362cbf0d1514d2e81.jpeg

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:分布式数据库系统,采用行和列的混合存储方式,支持列级别的高效查询。

dbb1c1cf69312ee20d02012356341d47.png

列式存储 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"}
]

列式存储如下图所示:

8f940a1ad3b337b48ffa42a8ff28bb2c.png

当这些文档被索引到 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, 依然可以被检索的原因。

f31410e8aed924373f9460b596c63b9a.png

再进一步验证,

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"}}
}

得到结果如下:

8988f4c82918b5c4defffc58addaefb4.png

这就是基于正排索引做的轮询的结果。

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 等)都要被读取。如下图所示:

4a902b99b167882a398fcf1b7d9c1e05.png

读取整行信息,有点类似 MySQL 如下操作:

SELECT * FROM employees WHERE employee-id = '1111';

返回结果:

{"employee-id": "1111", "name": "Alice", "age": 30, "salary": 5000, "address": "123 Main St, Springfield, IL"}

如果列式存储:只读取特定字段的数据。

列式存储举例——计算平均薪资时,只需读取 salary 列的数据即可,避免了读取无关字段的数据。如下图所示。

fe8fbf6156c57500700fdc88b125641b.png

列式存储读取一列数据,有点类似 MySQL如下操作:

SELECT age FROM employees;

返回结果:

[30, 25, 35]
  • 劣势:对于未被索引的字段,查询效率较低,因为需要遍历整个列的数据来匹配查询条件。

4、结论

通过这些示例,我们可以更清楚地理解 Elasticsearch 中列式存储和 doc_values 的应用。

列式存储使得对特定字段的聚合和排序操作更加高效,但对于未被索引的字段,查询效率较低,因为需要遍历整个列的数据来匹配查询条件。

希望这些解释能帮助你更好地理解 Elasticsearch 的存储和查询机制。

如果你对字段的查询和聚合有特定需求,合理使用 index 和 doc_values 设置可以大大提升性能和效率。

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

75a96eb2c50e3e1ab9258d032a4d38f9.png

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

5e87b3158bca3c414844d70a35fdbb12.gif

比同事抢先一步学习进阶干货!

相关文章:

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. 内存泄漏检测 字符串拼接会在内存中创建新…...

深层网络:层数多真的更好吗?

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

【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倍速,然后找到你该刷的课&…...

龙虎榜——20250610

上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...