[译]Elasticsearch _source Doc_values And Store Performance

news2024/11/24 3:59:47

原文地址
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.coloradmin.cn/o/1649805.html

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

相关文章

【C++STL详解(七)】--------stack和queue介绍与使用

目录 前言 一、stack Ⅰ.介绍 Ⅱ.使用 1、定义方式 2、常用接口: 3、使用示例 二、queue Ⅰ、介绍 Ⅱ、使用 1、定义方式 2、常用接口 3、使用示例 三、deque(了解) 四、容器适配器 前言 前面我们已经在数据结构中已经了解到有关栈和队列的相关知识&…

Linux搭建http发布yum源

1、搭建http源yum仓库 (1)在yum仓库服务端安装httpd yum -y install httpd (2)修改配置文件 我们httpd 中默认提供web 界面的位置是我们/var/www/html 目录,如果我们yum 源想指定目录,就需要修改蓝框2处…

产品需求文档怎么写?超详细的产品需求文档PRD模板来了!

产品需求文档怎么写?如何写一份简洁明了、外行人看了就能秒懂的产品需求文档呢?今天这篇文章,就来和大家分享如何编写一份高质量的产品需求文档 PRD! 下图是来自 boardmix 模板社区的「产品需求文档」模板,它给出了一…

从0到1提审苹果商店(appstore)上线一款新APP

本篇主要复盘和介绍一款APP如何从0到1上线到苹果商店,将我自己项目遇到的坑跟大家分享,希望能为同样做开发或者运营的你提供经验,少走弯路。 如果你是24年1月1日之后开始首次提审APP,还需要先将自己的APP在工信部备案,苹果后台增加了工信部备案号的填写,备案方法和经验如…

QX-mini51单片机学习(1)---电子电路基础

目录 1电平特性 2单片机io口简绍 3初识电容电阻 4初识电路原理图 5单片机最小系统结构 6单片机工作基本时序 1电平特性 单片机是一种数字集成芯片,数字电路中两种电平,高电平与低电平 高电平:5v 低电平:0v TTL电平信号…

数仓开发中期:理论巩固

一、数仓以及商业智能(Data Warehousing and Business Intelligence, DW/BI)系统 1.1数据操作和数据获取的区别 对所有组织来说,信息都是其最重要的财富之一。信息几乎总是用作两个目的:操作型记录的保存和分析型决策的制定。简单来说&…

后仿中必须读懂的User-defined primitives(UDP)

一 UDP定义规则 UDP,全名:User-defined primitives。 用户自己定义的原语。 UDP可分为:combinational UDP(组合逻辑)和 sequential UDP(时序逻辑)。 1.1 组合逻辑UDP combinational UDP用于…

Gradio之blocks灵活搭建页面

这里写目录标题 搭建一个UI界面搭建上半部分的框架比例调节以及其他效果搭建下半部分左边部分搭建下半部分右边部分拓展-CSS的应用 使用标签搭建第二个页面示例 补充AccordionGroup() 搭建一个UI界面 搭建上半部分的框架 如下图,我们想要基本还原下图右边的UI界面…

PVZ2 植物克僵尸【第二期】

众所周知,PVZ2(植物大战僵尸2)中有许多恶心的僵尸,而我们不得不派出它们的————克星!(*为建议方法) 5.战机小鬼 战机小鬼,恶心会发射子弹,所以: 1&…

【华为OD机试】攀登者2(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[…

[Java EE] 多线程(九):ReentrantLock,Semaphore,CountDownLatch与线程安全的集合类(多线程完结)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

力扣437. 路径总和 III

Problem: 437. 路径总和 III 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义int类型函数rootSum(root, targetSum),用于求取每一个节点等于目标函数的路径数: 1.1.易知rootSum(root, targetSum)求出的数量等于rootSum(root.left, targetSum - va…

智慧公厕建设,打造智慧城市基础设施新亮点

公共厕所是城市基础设施的重要组成部分,而智慧公厕的建设则是现代城市管理的创新之举。为了实现公厕的精细化管理和提供更便捷的服务,推进智慧公厕建设必须要实现技术融合、业务融合、数据融合的目标,跨越层级、地域、系统、部门和业务的限制…

LeetCode:盛最多水的容器

文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1,a2,…,an,每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线,垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线,使得它们与…

自动化运维管理工具----------Ansible模块详细解读

目录 一、自动化运维工具有哪些? 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

机器学习第二天(监督学习,无监督学习,强化学习,混合学习)

1.是什么 基于数据寻找规律从而建立关系,进行升级,如果是以前的固定算式那就是符号学习了 2.基本框架 3.监督学习和无监督式学习: 监督学习:根据正确结果进行数据的训练; 在监督式学习中,训练数据包括输…

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构:方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

Day1| Java基础 | 1 面向对象特性

Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么?多态特性你是怎…

基于Springboot+Vue的Java项目-鲜牛奶订购系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

matplotlib和pandas与numpy

1.matplotlib介绍 一个2D绘图库; 2.Pandas介绍: Pandas一个分析结构化数据的工具; 3.NumPy 一个处理n纬数组的包; 4.实践:绘图matplotlip figure()生成一个图像实例 %matplotlib inline:图形直接在…