[译]Elasticsearch _source Doc_values And Store Performance

原文地址
https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html

在这篇博文中,我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上,Lucene(Elasticsearch 和 Solr 构建的基础库)提供了两种存储和检索字段的方法:存储字段(stored fields)和文档值(docvalues)。 此外,Elasticsearch 默认使用 _source 字段,这是一个大 JSON,其中包含在索引时作为输入给出的文档的所有字段。

为什么 Elasticsearch 使用 _source 字段作为默认值?从性能的角度来看,所有这些可能性有什么区别? 让我们来看看吧!

Stored And Docvalues Fields In Lucene

当我们在 Lucene 中索引文档时,已索引的原始字段的信息会丢失。 根据模式配置对字段进行相应的分析、转换和索引。 在没有任何额外数据结构的情况下,当我们搜索文档时,我们得到的是搜索到的文档的 id,而不是原始字段。 为了获取这些信息,我们需要额外的数据结构。 Lucene 为此提供了两种可能性:存储字段和文档值。

STORED FIELDS

存储字段的目的是存储字段的值(不进行任何分析)以便在查询时检索它们。

DOCVALUES

引入文档值是为了加速分面、排序和分组等操作。 文档值还可用于在查询时返回字段值。 我们唯一的限制是我们不能将它们用于文本字段。

存储字段和文档值在 Lucene 库中实现,它们可以在 Solr 和 Elasticsearch 中使用。

我写了一篇博客文章,其中比较了 Solr 中存储字段和文档值的字段检索性能:

DocValues VS 存储字段:Apache Solr 功能和性能 SmackDown

在那里您可以找到有关存储字段和文档值、其利用率和约束的更详细描述。

Field Retrieval In Elasticsearch

如果我们在映射中显式定义存储字段和文档值,则可以在 Elasticsearch 中使用它们:

"properties" : {"field": {"type": "keyword","store": true,"doc_values" true}
}

默认情况下,每个字段的存储设置为 false。 相反,所有支持文档值的字段都默认启用它们。

独立于存储和文档值配置,在查询时返回查询命中的文档中每个字段的值。 发生这种情况是因为 Elasticsearch 使用另一个工具进行字段检索:elasticsearch _source 字段。

ELASTICSEARCH _SOURCE FIELD

源字段是在索引时传递到 Elasticsearch 的 JSON。 该字段在 Elasticsearch 中默认设置为 true,并且可以通过以下方式使用映射来禁用:

"mappings": {"_source": {"enabled": false}
}

查询时默认返回所有字段。 您甚至可以仅指定要在响应中返回的源中的字段子集。 这应该可以加快响应在网络上的传输速度。

通过正确的配置,某些字段可以被源字段排除:

PUT logs
{"mappings": {"_source": {"excludes": ["meta.description","meta.other.*"]}}
}

从源中排除字段将减少磁盘空间使用量,但排除的字段永远不会在响应中返回。

禁用 elasticsearch _source 字段将导致无法在不从头开始重新索引的情况下更新文档(Disabling the elasticsearch _source field will make it impossible to update a document without reindexing that from scratch)。 事实上,为了更新文档,我们需要从旧文档中获取字段的值。 从逻辑上讲,使用存储的字段或文档值从旧文档中获取字段的值应该是可行的(这就是 Solr 中原子更新的工作方式)。 但是,由于设计决策,Elasticsearch 中不允许这样做,如果您需要更新文档,则必须在 Elasticsearch 索引配置中启用 _source 字段。

RETRIEVING FIELDS

在 Elasticsearch 中,您可以启用或禁用 _source 字段并使字段存储和/或文档值。 但是我们如何在查询时检索字段呢?

默认情况下,如果定义了整个源,则返回整个源。 您可以避免它并仅返回源的子集,如下所示:

 "fields": ["field1", "field2"],"_source": false

但是,如果您没有启用源字段,并且想要从存储的或文档值返回字段,则必须以其他方式告诉 Elasticsearch。 对于您使用的每个源,您必须以不同的方式指定字段列表:

 "fields": ["sv1", "sv2",...],"docvalue_fields": ["dv1", "dv2",...],"stored_fields" : ["s1", "s2",...],

例如,如果您有一个存储字段和文档值字段,您可以选择是否要从文档值或存储字段中检索它。 从功能的角度来看,这是完全相同的,但您的选择可能会影响查询的执行时间。

STORED FIELDS,DOCVALUES AND ELASTICSEARCH_SOURCE INTERNAL REPRESENTATION

在本节中,我只想对存储字段、_source 字段和文档值的内部结构进行简要概述,以便有一些工具来理解使用这些方法进行字段检索的性能期望是什么。

STORED FIELDS INTERNALS

存储的字段以行的方式放置在磁盘上:对于每个文档,我们都有一行连续包含所有存储的字段。

在这里插入图片描述

以上图为例。 要访问文档 x 的 field3,我们必须访问文档 x 的行并跳过 field3 之前存储的所有字段。 跳过字段需要获取其长度。 跳过字段并不像读取字段那么昂贵,但此操作并不是免费的。

DOCVALUES INTERNALS

文档值以列的方式存储。 不同文档的相同字段的值都连续地存储在内存中,并且可以"几乎"直接访问某个文档的某个字段。 计算所需值的地址并不是一项简单的操作,并且具有计算成本,但我们可以想象,如果我们只需要一个字段,那么使用这种访问会更有效。

ELASTICSEARCH _SOURCE FIELD INTERNALS

那 _source 呢? 嗯,如上所述,源是一个大字段,其中包含一个 JSON,其中包含索引时提供给 Elasticsearch 的所有输入。 但是,这个字段是如何存储的呢? 毫不奇怪,Elasticsearch 利用了 Lucene 已经实现和提供的机制:存储字段。 特别是,_source 字段是该行中第一个存储的字段。

在这里插入图片描述

必须读取整个 _source 才能使用它包含的信息。 如果我们要返回文档的所有字段,这个过程直观上是最快的。 另一方面,如果我们只需要返回它包含的信息的一小部分,读取这个巨大的字段可能会浪费计算能力。

Benchmarking

为了对 3 种类型的字段进行基准测试,我在 Elasticsearch 中创建了 3 个不同的索引。 我对来自 Wikipedia 的 100 万份文档建立了索引,对于每个文档,我用三种不同的方法对 100 个包含 15 个字符的字符串字段建立了索引:在第一个索引中,我将字段设置为存储,在第二个索引中将字段设置为文档值。 在这两个索引中,我禁用了源字段。 相反,在第三个索引中,我只是启用了源字段。

文档和查询集合取自此处。 我使用真实的集合来模拟现实场景。

执行详情:

  • CPU:AMD锐龙3600
  • 内存:32GB

对于每个查询,我请求最好的 200 个文档,并重复测试,将要返回的字段数(在我创建的 100 个随机字符串字段中)从 1 更改为 100。

这是基准测试的结果:
在这里插入图片描述

结果完全符合我们的预期。**如果每个文档需要几个字段,则建议使用文档值。**另一方面,当我们想要返回整个文档时,_source字段是最好的字段,而存储字段的使用是其他两个字段之间的完美折衷。

在我执行的基准测试场景中,如果我们只需要一个字段,则 docvalues 的速度几乎是 _source 字段的两倍,而在极端相反的情况下,如果我们想返回所有字段,则图表显示,当我们只需要一个字段时,速度几乎提高了 2 倍。 使用 _source 字段代替 docvalues。

总之,性能并不是我们必须考虑的唯一参数。 正如我们在这篇博文中简要解释的那样,使用一种或另一种方法存在一些限制。 由于您的用例的某些限制,您可能被迫使用这三种方法之一。 即使从表现来看,我们也没有明显的赢家。

如果磁盘空间不是问题,您甚至可以混合使用不同的方法并将字段设置为存储和文档值,并启用源。 在查询时,Elasticsearch 使您能够选择所需的字段列表,以及是否希望从 _source、stored 或 docvalues 返回它们。

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

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

相关文章

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第16课-跳转私信

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第16课-跳转私信 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

Map集合的实现类~HashMap

存储结构:哈希表 键重复依据是hashCode和equals方法(键不能重复) 添加: 先创建Student类,那么往HashSet添加的就是Student对象作为键值,后面的作为值 删除: 判断: 遍历&#xff1a…

就业班 第三阶段(redis) 2401--5.7 day2 redis2 哨兵(前提是做好了主从)+redis集群

1、设置密码(redis) 先在redis.conf里面找到这个 后面写上要设置的密码即可 2、哨兵模式 监控redis集群中master状态的的工具 在做了主从的前提下 主 从1 从2 作用 1):Master状态检测 2):如果Master异常,则会进行…

(四)JSP教程——request内置对象

request对象是将客户端浏览器数据提交给服务器端JSP页面的唯一数据通道,通过该通道JSP页面能够获取浏览器信息、form表单信息、URL参数信息等。 1.from表单向JSP文件传递数据 form表单是浏览器向服务器传递数据的一种基本机制,包含两种方式:…

C/C++开发环境配置

配置C/C开发环境 1.下载和配置MinGW-w64 编译器套件 下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载后解压并放至你容易管理的路径下(我是将其放在了D盘的一个software的文件中管理) 2.…

快速找出存(不存在)在某个(或多个)文件的文件夹

首先,需要用到的这个工具: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 想要找出有下面这个文件存在的文件夹 切换到批量文件复制版块,快捷键Ctrl5 右侧,搜索添加 选定范围,勾选搜索文件夹、包…

【牛客】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…

网络基础(全)

协议 ”协议“就是一种约定。那么协议需要需要管理吗&#xff1f;答案是当然需要管理呀。 操作系统要进行协议管理——先描述&#xff0c;在组织协议本质就是软件&#xff0c;软件是可以进分层的协议在设计的时候&#xff0c;就是被层状的划分的为什么要划分为层状结呢&#…

Vue3专栏项目 -- 一、第一个页面(上)

一、ColumnList 组件&#xff08;专栏列表组件&#xff09;编码&#xff1a; 该组件要接收一个数组&#xff0c;数组中是一个个专栏数据&#xff0c;数据中包括id、title、avator、description。所以我们定义一个泛型&#xff0c;泛型为id为number类型title为string类型如下这…

远程服务器 docker XRDP 桌面访问 记录

需求描述: 我现在在远程连接 一台服务器&#xff0c;由于需要实验环境需要GUI 和 桌面系统&#xff0c;但是又想在 docker 中运行。因此&#xff0c;我现在首先需要通过 ssh 连接服务器&#xff0c;然后再服务器中连接 docker. REF: https://github.com/danielguerra69/ubuntu-…

如何全面规避医疗数据安全风险?“一中心三大管控域”打开新思路!

作为医院的核心基础设施&#xff0c;数据库已然演变成了一种具有“资产”属性的重要元素。而随着不断变化的医疗业务场景和日趋严格的合规性要求&#xff0c;如何让安全全方位贯穿医疗数据的生命周期&#xff0c;是一项系统性的建设工作&#xff0c;难点诸多。 基于多年的数据…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

视频剪辑神器:批量高效处理,轻松锐化视频让影片焕然一新!

视频已经成为我们记录生活、分享故事、展示才华的重要形式。然而&#xff0c;面对大量的视频文件&#xff0c;如何批量高效剪辑并提升视频质量&#xff0c;成为了许多人的难题。现在&#xff0c;我们为您带来一款视频剪辑神器&#xff0c;让您轻松处理视频&#xff0c;让您的影…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日&#xff0c;“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌&#xff0c;北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

leetCode81. 搜索旋转排序数组 II

leetCode81. 搜索旋转排序数组 II 题目思路 可以二分后的具体思路见我的上篇博客 搜索旋转排序数组 代码 class Solution { public:bool search(vector<int>& nums, int target) {if(nums.empty()) return false;int R nums.size() - 1;while(R > 0 &&…

【Three.js基础学习】15.scroll-based-animation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程要点 结合html等场景 做滚动动画 1.遇到的问题&#xff0c; 在向下滚动时&#xff0c;下方会显白&#xff08;部分浏览器&#xff09; 解决&#xff1a;alpha:true …

Finder Windows for Mac:双系统窗口,一键切换!

Finder Windows for Mac是一款专为Mac用户设计的实用工具&#xff0c;它模拟了Windows系统的窗口管理功能&#xff0c;让Mac用户也能享受到类似Windows的窗口操作体验。这款软件的主要功能是提供一个浮动面板&#xff0c;帮助用户随时即时访问打开的Finder窗口列表&#xff0c;…

某东抢购某台脚本——高版本

某东抢购某台脚本——高调 小白操作-学习参考 说明 这个脚本用于自动化京东的秒杀过程&#xff0c;特别是对于高需求商品如茅台。它展示了通过自动化工具模拟用户行为的能力&#xff0c;但同时也涉及到了使用自动化脚本可能违反网站使用条款的问题。使用此类脚本前应确保合…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…