【Elasticsearch】检索选定字段(Retrieve selected fields)

在 Elasticsearch 中,检索选定字段(Retrieve selected fields)是一个重要的功能,用于优化查询性能和减少数据传输量。以下是结合所有回答的详细总结,涵盖每种字段检索方式的原理、应用场景、性能特点以及限制。

1.`_source`参数

`_source`参数允许用户在查询时选择性地返回文档的原始 JSON 数据。Elasticsearch 默认会将整个文档存储在`_source`字段中,你可以通过`_source`参数指定需要返回的字段或排除某些字段。

原理

• 加载`_source`:Elasticsearch 加载整个`_source`字段。

• 解析 JSON:解析`_source`中的 JSON 数据。

• 选择或排除字段:根据`_source`参数中指定的字段路径,选择或排除字段。

• 返回结果:返回过滤后的字段。

适用场景

• 灵活性:适用于需要动态选择字段的场景。

• 部分字段:可以通过`_source`过滤返回部分字段或排除某些字段。

限制

• 需要加载和解析整个`_source`,性能可能较低,尤其是在处理大型文档时。

示例

```json

GET /my-index/_search

{

  "query": {

    "match_all": {}

  },

  "_source": ["field1", "field2.*"]

}

```

2.`fields`参数

`fields`参数从索引的映射(mapping)中提取字段值,而不是从`_source`中解析。这种方式通常更高效。

原理

• 查询映射:Elasticsearch 查询索引的映射,了解字段的类型和存储方式。

• 选择数据源:

• 如果字段启用了`doc_values`,则从 doc values 中读取字段值。

• 如果字段未启用`doc_values`,则从`_source`中解析字段值。

• 格式化字段值:支持对日期和地理空间字段进行格式化。

适用场景

• 高效检索:适用于需要高效检索特定字段值的场景。

• 格式化支持:支持对日期和地理空间字段进行格式化。

限制

• 不支持直接检索`text`类型字段的原始值。

• 如果字段未启用`doc_values`,则需要从`_source`中解析字段值,可能会影响性能。

示例

```json

GET /my-index/_search

{

  "query": {

    "match_all": {}

  },

  "fields": ["field1", "field2.*"]

}

```

3.`docvalue_fields`参数

`docvalue_fields`参数专门用于从 doc values 中检索字段值。Doc values 是一种列式存储结构,优化了字段值的读取速度,特别适用于排序和聚合操作。

原理

• 列式存储:Doc values 是一种列式存储结构,将字段值以列的形式存储在磁盘上,便于快速读取。

• 直接读取:`docvalue_fields`直接从 doc values 中读取字段值,避免了解析`_source`,从而提高了查询性能。

• 内存映射:为了进一步提高性能,Elasticsearch 会将 doc values 加载到内存中进行操作。

适用场景

• 排序和聚合:适用于需要高效排序或聚合的字段,如`keyword`、`date`、`numeric`等。

• 性能优化:直接从 doc values 中读取,性能更高。

限制

• 不支持`text`类型字段。

• 如果字段未启用`doc_values`,则无法使用`docvalue_fields`。

示例

```json

GET /my-index/_search

{

  "query": {

    "match_all": {}

  },

  "docvalue_fields": ["field1", "field2.*"]

}

```

4.`stored_fields`参数

`stored_fields`参数用于检索在映射中明确标记为存储的字段。

原理

• 存储字段:`stored_fields`直接从存储的字段中检索值,这些字段在索引时被标记为`store: true`。

• 避免解析`_source`:与`_source`不同,`stored_fields`不需要加载和解析整个`_source`,因此性能更高。

适用场景

• 存储字段:适用于字段被标记为存储的场景。

• 高效检索:直接从存储中检索字段值,避免了解析`_source`。

限制

• 如果字段未被标记为`store: true`,则无法通过`stored_fields`检索。

• 不支持嵌套字段(`nested`),需要在`inner_hits`中使用。

示例

```json

GET /my-index/_search

{

  "query": {

    "match_all": {}

  },

  "stored_fields": ["field1", "field2"]

}

```

5.`script_fields`参数

`script_fields`参数允许通过脚本动态计算字段值。

原理

• 动态计算:`script_fields`使用 Painless 脚本在查询时动态计算字段值。

• 访问`_source`或倒排索引:脚本可以访问`_source`或倒排索引中的字段值。

适用场景

• 动态计算:适用于需要在查询时动态计算字段值的场景。

• 灵活性:可以基于其他字段值进行复杂计算。

限制

• 如果字段未被索引,脚本无法访问这些字段的倒排索引值。

• 脚本计算可能会增加查询的复杂性和执行时间。

示例

```json

GET /my-index/_search

{

  "query": {

    "match_all": {}

  },

  "script_fields": {

    "calculated_field": {

      "script": {

        "source": "doc['field1'].value * 2"

      }

    }

  }

}

```

6.无法使用的字段

每种字段检索方式都有其适用范围和限制,以下是一些无法使用的字段类型:

`_source`参数

• 未存储在`_source`中的字段:如果`_source`被禁用(`_source: false`),则无法通过`_source`参数检索任何字段。

`fields`参数

• `text`类型字段:`text`类型字段默认不支持通过`fields`检索,因为它们被分词处理。

• 未索引的字段:如果字段被设置为`index: false`,则无法通过`fields`检索。

• 动态映射禁用的字段:如果动态映射被禁用(`dynamic: false`),未显式定义的字段无法通过`fields`检索。

`docvalue_fields`参数

• `text`类型字段:`text`类型字段不支持 doc values,因此无法通过`docvalue_fields`检索。

• 未启用 doc values 的字段:某些字段类型(如`text`)默认不支持 doc values,即使启用`doc_values: true`,`text`字段仍然无法使用。

`stored_fields`参数

• 未标记为存储的字段:如果字段未被标记为`store: true`,则无法通过`stored_fields`检索。

• 嵌套字段:`stored_fields`不支持直接检索嵌套字段(`nested`),需要在`inner_hits`中使用。

`script_fields`参数

• 未索引的字段:如果字段未被索引,脚本无法访问这些字段的倒排索引值。

• 性能限制:脚本计算可能会增加查询的复杂性和执行时间。

7.字段检索方式的选择指南

根据你的具体需求选择合适的方式,以优化查询性能和资源利用率:

 

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

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

相关文章

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例 Delete删除数据语法案例 截断表语法案例 插入查询结果语法案例 聚合函数函数介绍案例 group by子句的使用语…

docker 基础命令使用(ubuntu)

docker 状态查询 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作镜像命令 docker imagesdocker rmi 镜像id/镜像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 参数…

idea 2023.3.7常用插件

idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace …

基于Flask的广西高校舆情分析系统的设计与实现

【Flask】基于Flask的广西高校舆情分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统综合运用Python、Flask框架及多种数据处理与可视化工具开发,结合Boot…

用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。

要实现Ubuntu中自己开发的Python程序自动升级,可以通过以下几种方式: 1. 使用 Git 仓库 定时任务 如果你的Python程序托管在Git仓库中,可以通过定时拉取最新代码来实现自动升级。 步骤: 确保Python程序在Git仓库中。在Ubuntu上…

破解微服务疑难杂症:2025年全解决方案

微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等…

Linux(Centos 7.6)命令详解:head

1.命令作用 将每个文件的前10行打印到标准输出(Print the first 10 lines of each FILE to standard output) 2.命令语法 Usage: head [OPTION]... [FILE]... 3.参数详解 OPTION: -c, --bytes[-]K,打印每个文件的前K字节-n, --lines[-],打印前K行而…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换(SNAT,Source NAT): 目标地址转换(DNAT,Destination NAT): 端口地址转换(PAT&#xff0c…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况: 异常情况: 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…

Android 10.0 移除wifi功能及相关菜单

介绍 客户的机器没有wifi功能,所以需要删除wifi相关的菜单,主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式,长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…

DeepSeek HuggingFace 70B Llama 版本 (DeepSeek-R1-Distill-Llama-70B)

简简单单 Online zuozuo :本心、输入输出、结果 文章目录 DeepSeek HuggingFace 70B Llama 版本 (DeepSeek-R1-Distill-Llama-70B)前言vllm 方式在本地部署 DeepSeek-R1-Distill 模型SGLang 方式在本地部署 DeepSeek-R1-Distill 模型DeepSeek-R1 相关的 Models,以及 Huggin…

服务器中部署大模型DeepSeek-R1 | 本地部署DeepSeek-R1大模型 | deepseek-r1部署详细教程

0. 部署前的准备 首先我们需要足够算力的机器,这里我在vultr中租了有一张A16显卡一共16GB显存的服务器作为演示。部署的模型参数为14b的。如果需要部署满血版本671b的,需要更大的算力支持,这里由于是个人资金有限,就演示14b的部署…

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

🎓 毕业设计大揭秘!想要源码和文章?快来私信我吧! Hey小伙伴们~ 👋 毕业季又来啦!是不是都在为毕业设计忙得团团转呢?🤔 别担心,我这里有个小小的福利要分享给你们哦&…

基于Go语言 XTA AI聊天界面实现

项目开源地址: XTA-AI-SDK 人工智能技术的迅速发展,AI聊天应用变得越来越流行。本文将介绍如何使用Go语言和LCL库( Lazarus Component Library)创建一个功能丰富的AI聊天界面。项目主要包含以下模块: 项目背景 本项目旨在为开发…

使用 Apache PDFBox 提取 PDF 中的文本和图像

在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…

MongoDB 7 分片副本集升级方案详解(下)

#作者:任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项: 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0,即在其他成员可用…

AlmaLinux release 9.4 (Seafoam Ocelot)安装包 build失败

pip 安装失败 显示 build 失败 Building wheels for collected packages: cymem, murmurhashBuilding wheel for cymem (pyproject.toml) ... errorerror: subprocess-exited-with-error Building wheel for cymem (pyproject.toml) did not run successfully.│ exit code: …

CMS DTcms 靶场(弱口令、文件上传、tasklist提权、开启远程桌面3389、gotohttp远程登录控制)

环境说明 攻击机kali:192.168.111.128 信息收集 主机发现 ┌──(root㉿kali-plus)-[~/Desktop] └─# nmap -sP 192.168.111.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-23 14:57 CST Nmap scan report for 192.168.111.1 Host is up (0.00039s latenc…

vue3.x 的 toRef详细解读

在 Vue 3.x 中,toRef 是一个用于创建响应式引用的工具函数。它可以将一个响应式对象的某个属性转换为一个独立的 ref 对象,同时保持与原始属性的响应式连接。以下是 toRef 的详细解读和示例。 1. toRef 的作用 核心功能 toRef 用于从响应式对象&#x…