作者:来自 Elastic JD Armada

学习如何使用 _mapping 和 _search API、子字段、合成 _source 和运行时字段来显示 Elasticsearch 索引的字段。

更多阅读:

  1. Elasticsearch:从搜索中获取选定的字段 fields

  2. Elasticsearch:inverted index,doc_values 及 source

  3. Observability:Elasticsearch 新的索引 mode: Logsdb 初体验

想获得 Elastic 认证吗?了解下一次 Elasticsearch Engineer 培训的时间!

Elasticsearch 拥有众多新功能,帮助你为你的使用场景构建最佳搜索解决方案。浏览我们的示例 notebooks 了解更多,开始免费 cloud 试用,或在本地机器上体验 Elastic。


本文将讨论如何显示 Elasticsearch 索引的字段。这有助于了解你的数据结构,识别特定字段,以及排查问题。我们将涵盖以下主题:

  1. 使用 _mapping API 获取字段信息
  2. 使用 _search API 显示字段值
  3. 显示子字段
  4. 合成 _source
  5. 运行时字段

1)使用 _mapping API 获取字段信息

_mapping API 允许你获取一个或多个索引的映射定义。这包括字段、它们的数据类型以及其他属性的信息。要获取特定索引的映射,请使用以下请求:

GET /<index_name>/_mapping

例如,如果你有一个名为 my_index 的索引,可以使用以下请求来获取它的映射:

GET /my_index/_mapping

响应将包含该索引的映射定义,其中包含字段及其属性的信息。

你也可以获取某个特定字段的映射。当映射较大且你只关注某个字段时,这会很有用。要获取特定字段的映射,请使用以下请求:

GET /my_index/_mapping/field/my_field

你也可以通过用逗号分隔字段名来获取多个字段的映射,如下所示的请求:

GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_3

2)使用 _search API 显示字段值

要显示 Elasticsearch 索引中字段的值,可以使用 _search API。_search API 提供多种方式来控制返回哪些字段,主要有以下两种:

  1. _source:_source 字段包含索引时的原始 JSON 文档正文,包括通过摄取管道或预处理步骤所做的任何更改。要从源文档中显示特定字段,可以使用源过滤(source filtering),我们将在下文介绍。
  2. fields:fields 参数允许你在搜索时根据索引映射检索文档中的特定字段。与 _source 不同,fields 可以返回存储字段(stored fields)、doc values 或运行时字段(runtime fields)的值,而无需引用 _source。不过,对于没有 doc values 或存储设置的标准字段,fields 会回退使用 _source。这样可以带来性能等多方面的优势,我们将在下文看到。

使用 _source 字段

默认情况下,_search API 会返回 _source 字段,它包含被索引的原始 JSON 文档。要显示特定字段,你可以在搜索请求中使用 _source 参数添加过滤器,这称为源过滤(source filtering)。

以下是一个搜索请求示例,用于返回 my_index 索引中文档的 title 和 author 字段的值:

GET /my_index/_search
{"query": {"match_all": {}},"_source": ["title", "author"]
}

在这个例子中,_source 参数指定了要返回的字段。

如果你需要更细致的控制,可以使用 _source 对象的 includes 和 excludes 属性。例如,下面的查询返回顶层的 title 字段和 author 的所有子字段,但排除 author.description。

GET /my_index/_search
{"query": {"match_all": {}},"_source": {“includes”: [“title”, “author.*],“excludes”: [“author.description”]}
}

在这个例子中,我们使用 author.* 模式来获取 author 对象的所有直接子字段。然后显式排除 author.description,这样只返回其他 author 字段。注意,这不会提升性能,因为仍需加载和解析源 JSON,但可以减少通过网络传输的响应大小。

使用 fields 参数

你可以使用 fields 参数过滤搜索响应中返回的字段。相比 _source,使用 fields 有以下几个好处:

  • 性能提升:fields 可以直接从存储字段(stored fields)或 doc values 返回值,无需加载完整的 _source,减小响应负载大小。

  • 格式化输出:对于标准字段,fields 可能回退到 _source 获取值,但会参考索引映射正确格式化输出,比如格式化日期,使其与聚合和排序中使用的格式一致。

  • 访问运行时字段:fields 可以返回运行时字段,这些字段在原始 _source 中不存在。

  • 更多好处可以参考相关文档。

例如,要仅返回 my_index 索引中的 title 和 author 字段,可以使用以下搜索请求:

GET /my_index/_search
{"query": {"match_all": {}},"fields": ["title", "author"],"_source": false
}

在上面的查询中,我们将 _source 字段设置为 false,这样就不返回源文档。这可以大幅减少响应的负载大小,但请注意,这仅因为字段 title 和 author 是 keyword 类型,且默认启用了 doc_values。如果字段未启用 doc_values 且 _source 设置为 false,Elasticsearch 无法检索这些字段,它们会在响应中被跳过。

需要注意的是,fields 响应总是返回每个字段的值数组,即使该字段只有一个值。这是因为 Elasticsearch 没有专门的数组类型,任何字段都可能有多个值。关于 Elasticsearch 中数组的更多信息,请点击这里。

其他获取字段的方法

虽然推荐使用 _source 或 fields 来获取字段,但也有其他方法适用于特定场景,例如:

Doc value 字段:如果你想完全避免使用 _source,可以使用 docvalue_fields 参数进行搜索。Doc values 存储与 _source 相同的字段值,但采用的是磁盘上的数据结构,优化了排序和聚合。

因为它独立于 _source 存储的值,你可以请求特定字段而无需加载整个 _source。对于查询大文档但只需要少数字段且这些字段支持 doc values 的情况,这很有用。另一个使用 docvalue_fields 的场景是对日期和数值字段使用自定义格式化,如下面示例所示。

请注意,这只适用于你启用了 doc_values 的字段或默认启用 doc_values 的字段类型,如 keyword、date、numeric 和 boolean,不适用于 text 或 annotated_text。

在这个例子中,我们使用 docvalue_fields 参数来检索 title、author 和 published 字段,而不加载完整的 _source 文档:

GET /my_index/_search
{"query": {"match_all": {}},"docvalue_fields": ["title","author",{"field": "published","format": "epoch_millis"}],"_source": false
}

当这个查询执行时,Elasticsearch 会直接从其磁盘上的列式存储中获取值,而不是引用每个文档的 _source。由于查询中提供了 format 参数,published 字段以 epoch_millis 格式返回,而不是默认格式。

存储字段(Stored fields):如果你在映射中显式将某些字段标记为 stored,可以使用 stored_fields 参数过滤这些字段。当你只想要轻量响应,仅包含这些特定字段,或想检索你故意存储的字段时,这很有用。存储字段独立于 _source,因此这种方法也适合避免加载 _source。

需要注意的是,这个选项默认是关闭的,且通常不推荐使用。建议使用源过滤(source filtering)来返回原始源文档的某些子集。

在下面的示例查询中,我们使用 stored_fields 参数来检索 summary 字段,该字段的索引映射配置为 "store": true。

GET /my_index/_search
{"query": {"match_all": {}},"stored_fields": ["summary"]
}

当这个查询执行时,Elasticsearch 会检查该字段是否标记了 "store": true,如果没有找到,则会完全跳过该字段。

显示子字段

如果你的索引包含子字段,可以在 fields 参数中使用点号表示法指定字段路径。注意,子字段不同于 nested 字段类型。例如,如果你有一个名为 address.city 的子字段,可以这样包含在搜索响应中:

GET /my_index/_search
{"query": {"match_all": {}},"fields": ["title", "author", "address.city"],"_source": false
}

在这个例子中,搜索响应将包含 title、author 和 address.city 字段的值。

合成 _source

如果你想保留使用 _source 的功能,同时节省磁盘空间,可以在索引映射中使用合成 _source。合成 _source 是一个功能,允许 Elasticsearch 根据已有的数据(如存储字段和 doc values)重建 _source,即使 _source 被禁用。这能节省大量存储空间,但查询时需要即时重建,速度会稍慢。你可以在索引设置中使用以下配置来启用此功能:

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

使用合成 _source 的一些好处包括:在使用 _search API 时可以完整显示文档,支持源过滤,并兼容像 Kibana 这样期望 _source 可用的其他功能和工具,同时避免存储完整的 _source 文档。

运行时字段

运行时字段(Runtime fields)允许你在查询时或索引映射的 runtime 块中定义脚本字段。这些字段不会被索引,因此添加运行时字段不会增加索引大小,但也不会出现在 _source 中。映射中定义的运行时字段是持久的,所有查询都可用;查询时定义的运行时字段是临时的,仅在该次搜索请求中可用。

使用运行时字段的主要好处是能够在数据已被摄取后添加字段,简化映射设计。运行时字段也适合用脚本生成原始文档中不存在的值,比如格式化字符串或计算分数。

但需要注意,运行时字段会影响性能,因为每个结果文档都需要运行脚本。你也可以通过 _search API 的 fields 参数来检索运行时字段。

总结

显示 Elasticsearch 索引的字段可以从简单地使用索引映射或 _source 获取值,到更高级地使用 fields、docvalue_fields 或运行时字段,以获得更高的控制和效率。理解不同方法的权衡对优化搜索体验非常关键。无论是优化响应负载,丰富文档内容,还是使用合成 _source 节省存储,Elasticsearch 都提供了多种工具和功能,帮助你以所需方式找到所需数据。这些技术能帮助你理解数据结构,识别特定字段,并排查问题。

原文:How to display fields of an Elasticsearch index - Elasticsearch Labs

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

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

相关文章

vue3父组件把一个对象整体传入子组件,还是把一个对象的多个属性分成多个参数传入

以一个对象整体传入时&#xff0c;对象的定义&#xff1a;<template><div><p>姓名: {{ userInfo.name }}</p><p>年龄: {{ userInfo.age }}</p><p>邮箱: {{ userInfo.email }}</p></div> </template> <script s…

【unitrix数间混合计算】2.1 数间混合计算模块(src/number/mod.rs)

一、源码 这段代码是一个Rust模块的声明和导出配置&#xff0c;主要用于实现"类型级数与基本类型混合计算"的功能。 //! 类型级数与基本类型混合计算// 模块声明 // -------------------------------- mod types; // 结构体定义 mod normalize; …

脱机部署k3s

离线部署 K3s 文档 1. 准备工作 操作系统准备&#xff1a;确保服务器已安装好基础操作系统&#xff08;Ubuntu、CentOS 等&#xff09;。关闭防火墙或放通端口&#xff1a;建议关闭防火墙或确保 6443、10250 等端口已开放。准备离线资源文件&#xff1a; 下载地址 k3s-airga…

[失败记录] 使用HBuilderX创建的uniapp vue3项目添加tailwindcss3的完整过程

写在前面 放弃了。。。 1&#xff09;方案1 - 参考下面的“完整步骤” - 安装成功&#xff0c;运行成功&#xff0c;但是&#xff01;好多class不生效&#xff01; 2&#xff09;方案2 - 不安装tailwindcss&#xff0c;直接使用独立的编译好的完整css文件&#xff01; …

使用Idea去git项目,发现拉取和推送都很慢的问题

在大多数情况下&#xff0c;用Idea去对项目进行拉取和推送是很方便的&#xff0c;对于新手来说也是非常友好的但是最近博主遇到了一个问题&#xff0c;就是我feat一个简单的类&#xff0c;去提交推送都需要很长的时间&#xff0c;甚至是20分钟&#xff0c;博主去找了很多方法。…

无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用

前言在无人机作业中&#xff0c;图传系统是连接空中与地面的关键纽带&#xff0c;而 5G 便携式多卡高清视频融合终端虽不直接搭载于无人机&#xff0c;却能通过地面协同突破传统微波图传的局限&#xff0c;为无人机远程监控、应急指挥提供稳定高效的传输支撑。型号&#xff1a;…

【博客系统UI自动化测试报告】

博客系统UI自动化测试报告一、项目背景二、测试内容(一)测试用例(二)测试账号(三&#xff09;使用Selenium进行Web自动化测试1.环境搭建2.创建浏览器驱动3.编写博客登陆模块的测试用例代码4.编写博客主页展示模块的测试用例代码5.编写博客创作模块的测试用例代码6.编写博客查看…

简单手写Transformer:原理与代码详解

Transformer 作为 NLP 领域的里程碑模型&#xff0c;彻底改变了序列建模的方式。它基于自注意力机制&#xff0c;摆脱了 RNN 的序列依赖&#xff0c;实现了并行计算&#xff0c;在机器翻译、文本生成等任务中表现卓越。本文将从零开始&#xff0c;手写一个简化版 Transformer&a…

Numpy科学计算与数据分析:Numpy入门之数组操作与科学计算基础

Numpy入门实践&#xff1a;从零开始掌握科学计算利器 学习目标 通过本课程的学习&#xff0c;学员将了解Numpy的历史背景、核心特点及其在科学计算中的重要性。学员将掌握如何使用Numpy进行数组操作&#xff0c;包括数组的创建、索引、切片以及基本的数学运算&#xff0c;为后…

python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握

为什么要讲和学习决策树呢?主要是决策树(包括随机森林算法)不需要数据的预处理。现实世界的数据往往“脏乱差”,决策树让你在数据准备上可以少花很多功夫,快速上手,用起来非常的“省心”。总之,决策树是机器学习领域里最直观易懂、解释性最强、应用最广泛的基础模型之一…

C语言:单链表学习

文件&#xff1a;main.c #include "linkedList.h"int main(int argc, char *argv[]) {// 创建头结点NODE *head NULL;// 创建链表if (llist_create(&head, 666) < 0){perror("链表创建失败&#xff01;");return -1;}// 向链表插入数据llist_addTa…

使用 decimal 包解决 go float 浮点数运算失真

文章目录问题解决注意问题 go float 在运算的时候会出现精度问题 package mainimport ("fmt" )func main() {var a float64 0.3var b float64 0.6fmt.Println("ab", ab) // 你以为是 0.9 但是结果是&#xff1a;0.8999999999999999 }你观察到的 0.3 …

MongoDB学习专题(六)复制集和分片集群

1、概念MongoDB复制集的主要意义在于实现服务高可用&#xff0c;类似于Redis中的哨兵模式2、功能1. 数据写入主节点时将数据复制到另一个副本节点上2. 主节点发生故障时自动选举出一个新的替代节点在实现高可用的同时&#xff0c;复制集实现了其他几个作用数据分发&#xff1a;…

vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2

1.性能提升 1.1.响应式系统的改进: 从 Object.defineProperty 到 Proxy Vue2:Vue 2 的响应式系统基于 Object.defineProperty,它为每个属性单独设置 getter 和 setter。虽然能够满足基本需求,但它在以下方面存在性能瓶颈: Vue2 中数组监听的局限性:Vue2 通过Object.defi…

进程生命周期管理:从创建到终止的完整逻辑

前言 在操作系统的世界里&#xff0c;进程就像一个个忙碌的 “工作单元”&#xff0c;从被创建到完成任务后终止&#xff0c;始终遵循着一套严谨的生命周期规则。理解进程的生命周期管理&#xff0c;是揭开操作系统多任务调度神秘面纱的关键 —— 而这其中&#xff0c;进程的创…

【显示器】背光板的结构和工作原理

背光板是LCD&#xff08;液晶显示器&#xff09;中的一个重要组件&#xff0c;它负责提供屏幕所需的光源。下面我们详细解释背光板的结构和工作原理。背光板的基本结构一个典型的背光板由以下几个主要部分组成&#xff1a;LED灯条&#xff1a;通常使用白色LED作为光源。导光板&…

hadoop HDFS 重置详细步骤

有时候我们需要对hdfs重置&#xff0c;步骤如下&#xff1a; 1、停止服务 2. 清除日志节点ssh dmp-hdfs-ns1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-ns2 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt2 rm -rf /disk1/dfs/jn/me…

前端性能优化:从请求到资源的精细调控

在用户体验为王的时代&#xff0c;前端性能直接决定产品的留存率。本文聚焦 “减少不必要的传输与加载损耗”&#xff0c;从 合并HTTP请求、启用压缩、减少Cookie、资源加载顺序 四个维度&#xff0c;拆解优化思路与落地方法。 一、合并HTTP请求&#xff1a;突破浏览器并发瓶颈…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势柱状图

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博舆情数据可视化分析-热词情感趋势柱状图…

脚本统计MongoDB集合结构信息

场景&#xff1a; 当想统计mongodb集合的结构是什么数据类型时。 1.利用variety.js解析 https://github.com/variety/variety 2.脚本 #!/bin/bash#userxxx #passwxxx host1xx.1x.1x.150 port27010 dbhgrtabs$(echo "show collections"|mongo ${host}:${port}/${db}|g…