Elasticsearch Synthetic _source

_source 字段包含索引时传入的原始 JSON 文档体。_source 字段本身不被索引(因此不可搜索),但会被存储,以便在执行获取请求(如 get 或 search)时返回。

如果磁盘使用很重要,可以考虑以下选项:

  • 使用 synthetic _source,在检索时重建源内容,而不是存储在磁盘上。这样可以减少磁盘使用,但会导致 Get 和 Search 查询中访问 _source 变慢。
  • 完全禁用 _source 字段。这样可以减少磁盘使用,但会禁用依赖 _source 的功能。

什么是 synthetic _source?

当文档被索引时,有些字段,比如需要生成 doc_values 或 stored fileds,来自 _source 的字段值会根据数据类型复制到独立的列表 doc_values 中(磁盘上的不同数据结构,用于模式匹配),这样可以独立搜索这些值。当在这些小列表中找到所需值后,返回原始文档。由于只搜索了小列表,而不是整个文档的所有字段值,搜索所需的时间会减少。虽然这种处理方式提升了速度,但会在小列表和原始文档中存储重复的数据。

更多阅读:

  • Elasticsearch:inverted index,doc_values 及 source

  • Elasticsearch: 理解 mapping 中的 store 属性

Synthetic _source 是一种索引配置模式,可以改变文档在摄取时的处理方式,以节省存储空间并避免数据重复。它会创建独立的列表,但不会保留原始的原始文档。相反,在找到值后,会使用小列表中的数据重建 _source 内容。由于没有存储原始文档,仅在磁盘上存储 “列表”,可以节省大量存储空间。

PUT idx
{"settings": {"index": {"mapping": {"source": {"mode": "synthetic"}}}}
}

需要注意的是,由于 _source 值是在文档被检索时即时重建的,因此需要额外时间来完成重建。这会为用户节省存储空间,但会降低搜索速度。虽然这种即时重建通常比直接保存源文档并在查询时加载更慢,但它节省了大量存储空间。通过在不需要时不加载 _source 字段,可以避免额外的延迟。

Synthetic _source 目前被广泛使用于 logsdb 及 TSDB。它可以帮我们节省许多的磁盘空间。

Elasticsearch 8.17 Logsdb:企业降本增效利器

支持的字段

Synthetic _source 支持所有字段类型。根据实现细节,不同字段类型在使用 synthetic _source 时具有不同属性。

大多数字段类型使用现有数据构建 synthetic _source,最常见的是 doc_values 和 stored fields。对于这些字段类型,不需要额外空间来存储 _source 字段内容。由于 doc_values 的存储布局,生成的 _source 字段相比原始文档会有修改。

对于其他所有字段类型,字段的原始值会按原样存储,方式与非 synthetic 模式下的 _source 字段相同。这种情况下不会有修改,_source 中的字段数据与原始文档相同。同样,使用 ignore_malformed 或 ignore_above 的字段的格式错误值也需要按原样存储。这种方式存储效率较低,因为为 _source 重建所需的数据除了索引字段所需的其他数据(如 doc_values)外,还会额外存储。

Synthetic _source 限制

某些字段类型有额外限制,这些限制记录在字段类型文档的 synthetic _source 部分。

Synthetic _source 不支持仅存储源的快照仓库。要存储使用 synthetic _source 的索引,请选择其他类型的仓库。

Synthetic _source 修改

启用 synthetic _source 时,检索到的文档相比原始 JSON 会有一些修改。

数组被移动到叶子字段

Synthetic _source 中的数组会被移动到叶子字段。例如:

由于 _source 值是通过 “doc values” 列表中的值重建的,因此原始 JSON 会被做一些修改。例如,数组会被移到叶子节点。

PUT idx/_doc/1
{"foo": [{"bar": 1},{"bar": 2}]
}

将变为:

{"foo": {"bar": [1, 2]}
}

这可能导致某些数组消失:

PUT idx/_doc/1
{"foo": [{"bar": 1},{"baz": 2}]
}

将变为:

{"foo": {"bar": 1,"baz": 2}
}

字段名称与映射一致

Synthetic _source 使用映射中字段的原始名称。当与动态映射一起使用时,字段名中带点(.)的字段默认被解释为多个对象,而在禁用子对象的对象中,字段名中的点会被保留。例如:

PUT idx/_doc/1
{"foo.bar.baz": 1
}

将变为:

{"foo": {"bar": {"baz": 1}}
}

如何将索引配置为 synthetic _source 模式

测试代码:在此测试中,将 synthetic _source 模式下的索引与标准索引进行对比。

PUT index
{"settings": {"index": {"mapping": {"source": {"mode": "synthetic"}}}}
}

测试

标准索引使用 multi-field 来说明如何通过全文搜索和聚合检索文档,并在 _source 内容中包含已禁用字段的值。

PUT test_standard
{"mappings": {"properties": {"disabled_field": {"enabled": false},"multi_field": {"type": "text","fields": {"keyword": {"type": "keyword"}}}}}
}

让我们导入一些示例文档:

PUT test_standard/_doc/1
{"multi_field": "Host_01","disabled_field" : "Required for storage 01"
}PUT test_standard/_doc/2
{"multi_field": "Host_02","disabled_field" : "Required for storage 02"
}PUT test_standard/_doc/3
{"multi_field": "Host_03","disabled_field" : "Required for storage 03"
}

全文搜索会检索带有 _source 内容的文档:

GET test_standard/_search
{"query": {"match": {"multi_field": "host_01"}}
}

结果:文档通过对已分析的字段进行全文搜索被检索到。返回的结果包含 _source 中的所有值,包括已被禁用的字段:

{"took": 17,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.9808291,"hits": [{"_index": "test_standard","_id": "1","_score": 0.9808291,"_source": {"multi_field": "Host_01","disabled_field": "Required for storage 01"}}]}
}

这里,synthetic _source 模式下的索引使用 multi-fields 来说明 “text” 数据类型如何用于 “doc values” 列表,以及禁用字段中的值如何不可用。

PUT test_synthetic
{"settings": {"index": {"mapping": {"source": {"mode": "synthetic"}}}},"mappings": {"properties": {"keyword_field": {"type": "keyword"},"multi_field": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"text_field": {"type": "text"},"disabled_field": {"enabled": false},"skill_array_field": {"properties": {"language": {"type": "text"},"level": {"type": "text"}}}}}
}

让我们导入一些示例文档:

PUT test_synthetic/_doc/1
{"keyword_field": "Host_01","disabled_field": "Required for storage 01","multi_field": "Some info about computer 1","text_field": "This is a text field 1","skills_array_field": [{"language": "ruby","level": "expert"},{"language": "javascript","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 1
}PUT test_synthetic/_doc/2
{"keyword_field": "Host_02","disabled_field": "Required for storage 02","multi_field": "Some info about computer 2","text_field": "This is a text field 2","skills_array_field": [{"language": "C","level": "guru"},{"language": "javascript","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 2
}PUT test_synthetic/_doc/3
{"keyword_field": "Host_03","disabled_field": "Required for storage 03","multi_field": "Some info about computer 3","text_field": "This is a text field 3","skills_array_field": [{"language": "golang","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 3
}

搜索 “keyword” 数据类型时需要精确匹配。另外,禁用字段中的值也不再可用。

GET test_synthetic/_search
{"query": {"match": {"keyword_field": "Host_01"}}
}

响应

{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.9808291,"hits": [{"_index": "test_synthetic","_id": "1","_score": 0.9808291,"_source": {"keyword_field": "Host_01","disabled_field": "Required for storage 01","multi_field": "Some info about computer 1","text_field": "This is a text field 1","skills_array_field": [{"language": "ruby","level": "expert"},{"language": "javascript","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 1}}]}
}

我们再做一次搜索:

GET test_synthetic/_search
{"query": {"match": {"multi_field": "info"}}
}

响应是:

{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 3,"relation": "eq"},"max_score": 0.13353139,"hits": [{"_index": "test_synthetic","_id": "2","_score": 0.13353139,"_source": {"keyword_field": "Host_02","disabled_field": "Required for storage 02","multi_field": "Some info about computer 2","text_field": "This is a text field 2","skills_array_field": [{"language": "C","level": "guru"},{"language": "javascript","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 2}},{"_index": "test_synthetic","_id": "3","_score": 0.13353139,"_source": {"keyword_field": "Host_03","disabled_field": "Required for storage 03","multi_field": "Some info about computer 3","text_field": "This is a text field 3","skills_array_field": [{"language": "golang","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 3}},{"_index": "test_synthetic","_id": "1","_score": 0.13353139,"_source": {"keyword_field": "Host_01","disabled_field": "Required for storage 01","multi_field": "Some info about computer 1","text_field": "This is a text field 1","skills_array_field": [{"language": "ruby","level": "expert"},{"language": "javascript","level": "beginner"}],"foo": [{"bar": 1},{"bar": 2}],"foo1.bar.baz": 1}}]}
}

更多阅读,请参考官方文档:_source field | Elastic Documentation

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + Element Plus 实现用户管理模块

本文介绍一个使用 Vue3 Element Plus 实现的用户与小组管理模块,支持用户的增删改查(CRUD)和分页管理,以及小组的新增和删除功能,适用于管理后台系统中的用户权限管理场景。 一、项目简介 该模块具备以下功能&#…

Python应用“面向对象”小练习

大家好!面向对象编程是一种以 “对象” 为核心的编程思想。对象可以看作是具有特定属性和行为的实体。例如,一个学生可以是一个对象,他的属性包括姓名和年龄,行为可以是打招呼。​ 代码呈现: # 定义类和对象 class Student:def __init__(sel…

线性回归原理推导与应用(八):逻辑回归二分类乳腺癌数据分类

乳腺癌数据是sklearn中自带的数据集,需要通过相关特征对是否患有乳腺癌进行分类。 数据清洗与建模 首先加载相关库和相关数据 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression import numpy as np import…

nginx的一些配置的意思

1.用这个端口可以访问到nginx 2.工作进程,设置成和cpu核心数一样即可 3.每个工作进程的最大网络连接数。 4.主机名称 设置反向代理时,把server_name设置成ip。 5.反向代理进行转发,localhost指的是nginx所在的机器。 关键字proxy_pass。 …

SID103S/D/Q-300nA, 轨至轨, CMOS 运算放大器替代SGM8141

概述 SID103系列产品是专注于超低功耗、轨至轨、CMOS运算放大器,最低工作电压可以支持到1.4V,并且工作时每个通道仅消耗300nA的电流。特别适合穿戴式、独立式等对功耗敏感的电池供电场景。 SID103系列产品拥有5kHz的增益带宽积,外接500pF电…

十六进制字符转十进制算法

十六进制与十进制对照 十六进制十进制00112233445566778899A10B11C12D13E14F15 十六进制与十进制区别 十六进制是满16进1,十进制是满10进1,这里要注意下区别,16进制的字符里面为什么是0-9没有10,这里面进了一位,表示…

微软技术赋能:解锁开发、交互与数据潜力,共探未来创新路

在微软 Build 2025 大会以及创想未来峰会上,微软展示的一系列前沿技术与创新应用,不仅展现了其在科技领域的深厚底蕴与前瞻视野,更为开发者和企业带来了前所未有的机遇与变革动力。 领驭科技作为微软中国南区核心合作伙伴及 HKCSP 1T 首批授…

并发基础|进程与线程

进程基础 什么是进程? 为了实现并发的功能,引入了进程的概念。 ​ 为了实现并发,需要引入多程序的环境,但是多程序的环境会造成一些单程序时不存在的问题,比如程序的之间没有了封闭性,程序不可以连续的执…

鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀,今天继续分享仓颉语言开发商城应用的实战教程,今天要做的是tabbar。 大家都知道ArkTs有Tabs和TabContent容器,能够实现上图的样式,满足基本的使用需求。而仓颉就不同了,它虽然也有这两个组件,…

LINUX526 回顾 配置ssh rsync定时备份(未完成)

配置SSH回顾: 1.关闭防火墙、selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config SELINUXdisable 2. 510 2.配置YUM源 我计划配本地yum源 2.1 yum源备份 cd /etc/yum.repos.d tar -zcf repo.tar.gz *.repo …

hdc - Mac本环境配置

1. 安装依赖工具 Homebrew 若未安装 Homebrew,打开终端执行: OpenJDK 11 HDC 依赖 Java 环境,安装 OpenJDK 11: 配置环境变量: 2. 安装 DevEco Studio 下载:从华为开发者联盟下载最新版 DevEco Studio。 …

项目三 - 任务8:实现词频统计功能

本项目旨在实现一个词频统计功能,通过读取文本文件并利用Java编程技巧处理和分析文本数据。首先,使用BufferedReader逐行读取文件内容,然后通过String.split(" ")方法将每行文本分割成单词数组。接下来,采用HashMap来存…

Python - 文件部分

- 第 101 篇 - Date: 2025 - 05 - 26 Author: 郑龙浩/仟墨 Python - 文件部分 学习时间: 2025-05-19 文章目录 Python - 文件部分一 文件与路径1 文本文件2 二进制文件3 编码格式① 常见编码格式② 指定编码格式③ 最佳格式④ 处理编码错误 4 绝对路径5 相对路径基本写法返回…

R语言开始绘图--柱状图

R语言是一种专门用于统计计算和图形显示的编程语言,广泛应用于数据分析、统计建模、数据可视化等领域。它由Ross Ihaka和Robert Gentleman于1993年在新西兰奥克兰大学开发,现已成为数据科学和统计学领域的重要工具。 R语言的特点 R语言具有丰富的统计和…

PYTORCH_CUDA_ALLOC_CONF基本原理和具体示例

PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb 是 PyTorch 提供的一项环境变量配置,用于控制 CUDA 显存分配的行为。通过指定此参数,可以有效管理 GPU 显存的碎片化,缓解因显存碎片化而导致的 “CUDA out of memory”(显存溢出&#…

Halcon仿射变换---个人笔记

文章目录 1.概述2.仿射变换类型3.仿射变换流程4.根据特征点、角度计算仿射变换矩阵4.1 从空变换矩阵创建仿射变换矩阵4.2 把旋转角度添加到仿射变换矩阵4.3 把缩放添加到仿射变换矩阵4.4 把平移添加到防射变换矩阵4.5 把斜切添加到仿射变换矩阵4.6 根据点和角度计算刚性仿射变换…

《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》

《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》 一、引言 在当今数字化的时代背景下,Linux操作系统凭借其卓越的性能、可靠性和开源的优势,在服务器、云计算、嵌入式系统等众多领域占据着举足轻重的地位。对于IT运维…

【Webtrees 用户手册】第 2 章 - 访客须知

Webtrees 用户手册/访客指南 信 第 2 章 - 访客须知 <- 章节概述 目录 1页面结构2标题菜单 2.1主题 2.1.1云2.1.2颜色2.1.3绝佳2.1.4最小2.1.5网络树2.1.6西妮娅 2.2语言2.3登记2.4搜索字段 3主菜单 3.1家谱3.2图表3.3列表3.4日历3.5报告3.6寻找3.7故事3.8常见问题 (FAQ) 4…

动态规划-918.环形子数组的最大和-力扣(LeetCode)

一、题目解析 听着有点复杂&#xff0c;这里一图流。 将环形问题转化为线性问题。 二、算法原理 1.状态表示 2.状态转移方程 详细可以移步另一篇博客&#xff0c;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 3.初始化 由于计算中需要用到f[i-1]和g[i-1]的值&…

飞牛fnNAS远程映射盘符

目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…