当前位置: 首页 > news >正文

深入理解Elasticsearch的`_source`字段与索引优化

在Elasticsearch (ES) 中,_source字段是一个关键组件,它不仅决定了数据的存储方式,还影响到查询时返回的内容。在某些场景下,我们可以通过配置_source来优化存储和性能,尤其是当我们希望减少存储空间或避免返回某些字段时。本篇博客将详细介绍如何通过_sourceexcludes 选项排除字段存储,但仍然保留其索引功能的操作原理及应用场景。

1. 什么是_source字段?

_source是每个文档在Elasticsearch中存储的原始数据。默认情况下,当你索引文档时,整个文档的数据会被存储在_source中,ES会将其完整存储并在查询时返回。当你进行GET请求获取文档时,返回的正是这个_source数据。

但是,在某些情况下,我们可能不希望存储所有字段的值,尤其是一些大型的文本字段。此时,通过配置_sourceexcludes选项,我们可以决定不将这些字段存储下来,但它们仍然可以被索引用于查询。

2. mappings中的_source配置示例

以下是一个mappings定义的示例,其中我们通过_sourceexcludes选项排除了两个字段:full_text_claimfull_text_description

"mappings": {"_doc": {"_source": {"excludes": ["full_text_claim","full_text_description"]},"properties": {"full_text_claim": {"type": "text"},"full_text_description": {"type": "text"},// 其他字段定义...}}
}

解读

  • _source字段的排除:通过 excludes 选项,我们明确排除了 full_text_claimfull_text_description。这意味着在存储文档时,这两个字段的原始数据不会被保存下来。
  • 索引功能依然保留:虽然没有存储这两个字段的数据,但它们依然可以被索引,也就是说,你依然可以基于这些字段进行查询和检索。
3. 为什么要排除某些字段?

在实际应用中,排除一些不需要存储的字段有以下几个好处:

  1. 节省存储空间:有些字段(例如全文本数据)可能非常大。如果你不需要这些字段在查询时返回,则可以选择不将它们存储在 _source 中,这样可以减少磁盘空间的占用。

  2. 提升索引效率:在写入文档时,ES 需要将每个字段的数据保存到 _source 中。如果某些字段的数据量较大,通过排除它们可以提升索引写入的效率,特别是对于高频写入的场景。

  3. 保护数据隐私:某些字段可能包含敏感数据,比如客户的隐私信息或机密字段。通过不存储这些字段,可以防止它们在查询结果中被返回,从而提升数据安全性。

  4. 减少网络开销:如果某些字段数据量大且在查询时不需要返回,排除它们可以减少查询时的数据量,提升响应速度,减少网络传输的负担。

4. 排除字段后,仍然可以检索吗?

这是一个关键问题:即使我们不存储某些字段,它们仍然可以用于查询和检索

在上面的 mappings 配置中,full_text_claimfull_text_description 虽然没有被存储在_source中,但由于它们被索引了,仍然可以用于全文检索。这意味着你依然可以基于这两个字段的数据进行搜索和查询操作。例如:

{"query": {"match": {"full_text_claim": "some search term"}}
}

这段查询语句依然可以正常运行,并返回匹配到的文档。这是因为虽然这些字段的原始数据没有存储下来,但它们的数据已经被索引,因此可以参与全文搜索。

5. 索引 vs 存储:二者的区别

在Elasticsearch中,需要明确区分索引和存储的区别:

  • 索引 (Indexing):当某个字段被索引时,它的数据会被ES处理并构建索引,用于查询操作。即使该字段不被存储,它仍然可以参与搜索。

  • 存储 (Storing):存储是指将字段的原始数据保存到_source中,方便在查询时将完整的数据返回给客户端。如果某个字段没有被存储,那么查询时无法返回其原始数据。

因此,即使字段被排除在_source之外,它依然可以参与查询,但查询结果中不会返回该字段的原始数据。

6. 如何控制哪些字段需要存储?

通过以下配置,可以决定哪些字段存储,哪些不存储:

"_source": {"excludes": ["field_name1", "field_name2"]
}

如果你希望某个字段不仅被索引,还能存储并在查询时返回,可以将其从excludes中移除,或者完全省略 excludes

"_source": {"excludes": []
}
7. 具体应用场景举例
  1. 全文检索应用:对于大型的文本字段,例如专利的详细描述、法律条款等,通常我们需要对其进行全文检索,但不需要每次查询都返回完整文本。通过排除字段的存储,只索引这些字段,可以提高系统性能。

  2. 日志系统优化:在日志分析系统中,某些字段可能包含详细的日志信息(例如堆栈跟踪、错误详情等),这些数据通常用于检索和分析,但不需要频繁返回给用户。通过排除这些字段的存储,可以显著减少存储需求。

  3. 敏感数据处理:某些系统中的数据(例如用户的隐私信息、交易详情等)可能包含敏感信息。为了确保数据隐私,开发者可能希望这些数据仅用于查询,而不直接返回给客户端。

8. 如何查询排除字段?

如果某些字段被排除在存储之外,你仍然可以在查询时通过这些字段进行检索,但无法直接返回这些字段的内容。你可以指定只返回那些未被排除的字段,例如:

{"_source": ["title", "app_date"],"query": {"match_all": {}}
}

这将返回文档中 titleapp_date 字段的数据,而不会返回被排除的 full_text_claimfull_text_description

9. 总结

Elasticsearch 提供了灵活的 _source 配置,允许我们通过 excludes 来排除不需要存储的字段。这样做的好处包括节省存储空间、提高写入效率、减少网络负担,以及确保数据隐私。同时,即使字段不被存储,它们依然可以被索引,用于查询和检索。理解并合理配置_source字段,能有效优化系统性能,适应不同的应用场景需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [C#学习笔记]LINQ
  • 企业微信运营工具:赋能企业数字化转型的利器
  • Playwright 和 Selenium的对比
  • 7.认识进程
  • 积分第二中值定理的证明
  • 结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图
  • 智慧赋能,铸就国防工业新辉煌-程易科技助力某军工企业数字化转型纪实
  • 【区块链通用服务平台及组件】微言科技数据智能中台
  • 一个成熟的软件测试工程师应该具备那些“技能”
  • 探索Python的隐秘角落:Keylogger库的神秘面纱
  • MYSQL的结构及常用语句
  • 使用jackson将json转换为对象时,自定义转换字段内容
  • 简单计算机网络概念
  • 与 D3.js 的对比:ECharts 在前端可视化中的优势与劣势
  • 数据库类型有哪些?
  • Angular 2 DI - IoC DI - 1
  • github从入门到放弃(1)
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Netty源码解析1-Buffer
  • SpiderData 2019年2月25日 DApp数据排行榜
  • uva 10370 Above Average
  • Vue官网教程学习过程中值得记录的一些事情
  • 安装python包到指定虚拟环境
  • 程序员最讨厌的9句话,你可有补充?
  • 码农张的Bug人生 - 见面之礼
  • 双管齐下,VMware的容器新战略
  • 算法之不定期更新(一)(2018-04-12)
  • 探索 JS 中的模块化
  • 一些关于Rust在2019年的思考
  • 中文输入法与React文本输入框的问题与解决方案
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #565. 查找之大编号
  • #70结构体案例1(导师,学生,成绩)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #VERDI# 关于如何查看FSM状态机的方法
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • ()、[]、{}、(())、[[]]命令替换
  • (06)金属布线——为半导体注入生命的连接
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (MATLAB)第五章-矩阵运算
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core Redis 使用有序集合实现延迟队列
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core中的时区转换问题