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

Elasticsearch 数据建模:从原理到实战的降维打击指南

Elasticsearch 数据建模:从原理到实战的降维打击指南 🚀

第一章 数据建模的物理法则:倒排索引的奇妙世界

1.1 倒排索引:比字典更聪明的数据结构

当你在ES中存入"Hello World"时,背后发生了这些魔法:

// 原始文档
{"id": 1,"content": "Hello World"
}// 倒排索引生成(简化版)
{"terms": {"hello": [1],"world": [1]},"doc_values": {"1": ["Hello World"]}
}

核心原理

  • 词典(Term Dictionary):存储所有唯一词项,使用FST(有限状态转换器)压缩存储
  • 倒排列表(Postings List):记录每个词项出现的文档ID和位置信息
  • Doc Values:列式存储,为排序和聚合加速

💡 冷知识:ES默认会为每个text字段同时生成正排和倒排索引,这就是为什么即使不指定fielddata=true也能做聚合的原因(但会吃内存!)

1.2 分片(Shard)的量子纠缠现象

一个索引被拆分成多个分片时,数据路由算法:

shard_num = hash(_routing) % num_primary_shards

重要参数

  • index.number_of_shards:主分片数(一旦设置不可修改)
  • index.routing_partition_size:自定义路由分区数
  • _routing字段:自定义路由键(默认使用_id)

分片设计黄金公式

理想分片大小 = (节点内存大小 * 0.5) / 预期分片总数

(每个分片建议控制在10-50GB之间)


第二章 映射设计的核武器库 💣

2.1 字段类型底层揭秘

类型数据结构内存消耗典型场景
text倒排索引 + DocValues全文搜索
keywordDocValues精确匹配/聚合
longBKD Tree最低范围查询
nested独立隐藏文档爆炸高一对多关系
join父子文档链表较高多对多关系

2.2 动态映射的七十二变

ES的类型自动识别规则:

def detect_type(value):if isinstance(value, bool):return "boolean"elif isinstance(value, float):return "float" elif re.match(r'^\d{4}-\d{2}-\d{2}$', value):return "date"# ...其他规则

防御性配置

{"mappings": {"dynamic": "strict", // 禁止未定义字段"properties": {"user": {"type": "object","dynamic": true // 允许子字段动态扩展}}}
}

2.3 分词器的解剖课

一个标准分析器的处理流程:

原始文本 -> 字符过滤器 -> 分词器 -> Token过滤器

自定义分析器示例

"settings": {"analysis": {"analyzer": {"my_analyzer": {"type": "custom","char_filter": ["html_strip"],"tokenizer": "ik_max_word","filter": ["lowercase","synonym_filter"]}},"filter": {"synonym_filter": {"type": "synonym","synonyms_path": "analysis/synonym.txt"}}}
}

第三章 高阶建模:时序数据与关联关系

3.1 时间序列优化六脉神剑

  1. 冷热架构:通过node.attr.box_type: hot标记节点
  2. Rollover API:自动滚动创建新索引
POST /logs-000001/_rollover 
{"conditions": {"max_age": "7d","max_docs": 1000000}
}
  1. Downsampling:使用TSDS(Time Series Data Stream)自动降采样
  2. 索引生命周期管理(ILM):自动化Hot->Warm->Cold->Delete流程

3.2 关联关系处理:ES版的《甄嬛传》

方案实现方式查询复杂度适用场景
Nested存储为独立隐藏文档O(n)一对少量,写少读多
Join父子文档同分片O(1)+Join层级关系
应用层关联多次查询+内存关联O(1)*n灵活但耗客户端资源
冗余字段数据反范式化O(1)读性能要求极高

父子文档路由陷阱

// 父子文档必须路由到同一分片
String routing = parentId; 
// 查询时必须指定路由
SearchRequestBuilder request = client.prepareSearch("index").setRouting(routing);

第四章 性能调优:从青铜到钛合金的进化

4.1 写入优化:让ES变身喷射战士

  • Refresh Interval:调整刷新频率(默认1s)

    {"settings": {"refresh_interval": "30s" // 写入高峰期可关闭(-1)}
    }
    
  • Bulk 黄金法则

    单批次大小 = 5~15MB
    并发线程数 = CPU核数 * 2
    
  • 索引缓冲区:调整indices.memory.index_buffer_size(默认10%)

4.2 查询加速:给Lucene引擎装涡轮

  • Force Merge:减少分段数量

    POST /index/_forcemerge?max_num_segments=1
    
  • 预热文件系统缓存

    GET /index/_search?query=xxx&preference=_cache
    
  • Doc Values优化

    {"properties": {"price": {"type": "integer","doc_values": true // 默认开启,非聚合字段可关闭}}
    }
    

第五章 终极实战:电商平台建模全流程

5.1 商品中心建模

PUT /products
{"settings": {"number_of_shards": 3,"index": {"sort.field": ["category_id", "price"],"sort.order": ["asc", "desc"] }},"mappings": {"dynamic": "strict","properties": {"spu_id": {"type": "keyword"},"sku_list": {"type": "nested","properties": {"sku_id": {"type": "keyword"},"specs": {"type": "flattened"} // 应对动态属性}},"category_ancestry": {"type": "keyword"}, // 存储类目路径 1/2/3"location": {"type": "geo_point"}}}
}

5.2 搜索推荐优化

混合搜索DSL

{"query": {"script_score": {"query": {"multi_match": {"query": "手机","fields": ["name^3", "description"]}},"script": {"source": """double score = _score;if (doc['sales'].value > 1000) {score *= 1.5;}return score;"""}}}
}

结语:建模是一门平衡的艺术

记住这三个永恒的矛盾:

  1. 存储成本 vs 查询性能:是否需要预处理字段?
  2. 灵活性 vs 稳定性:动态映射开还是关?
  3. 实时性 vs 吞吐量:Refresh间隔设多少?

最后送各位一张护身符:

# 查看索引的真实内存占用
GET _cat/indices?v&h=index,store.size,pri.store.size 

愿你的数据模型既能乘风破浪,又能岁月静好! 🌊

相关文章:

Elasticsearch 数据建模:从原理到实战的降维打击指南

Elasticsearch 数据建模:从原理到实战的降维打击指南 🚀 第一章 数据建模的物理法则:倒排索引的奇妙世界 1.1 倒排索引:比字典更聪明的数据结构 当你在ES中存入"Hello World"时,背后发生了这些魔法&#…...

python defaultdict用法

摘要 使用 defaultdict 可以简化处理字典中缺失键的情况。以下是几个使用 defaultdict 的示例,展示了它在不同场景下的应用。 示例 1:分组文件 假设我们有一组文件名,想要根据文件扩展名将它们分组。我们可以使用 defaultdict 来实现这一点…...

Java 与设计模式(15):模板方法模式

一、定义 模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架(也就是大致的步骤和流程),而将一些具体步骤的实现延迟到子类中。这样,子类可以不改变算法的结构即可重新定义算法的某些特定步骤。 二、Ja…...

ubuntu更新失败:apt-get install -f Transaction failed: 软件包系统已损坏

检查您是否使用了第三方源。如果是就禁用它们,它们常常导致问题。 然后在终端中运行以下命令:apt-get install -f Transaction failed: 软件包系统已损坏下列软件包未满足的依赖关系:sunloginclient: Depends: libappindicator3-1 但是 %%s 没…...

16-使用QtChart创建动态图表:入门指南

QtChart是Qt框架中的一个强大模块,用于创建各种类型的图表,如折线图、柱状图、饼图等。它提供了丰富的API和灵活的配置选项,使得开发者能够轻松地将数据可视化集成到应用程序中。本文将介绍如何使用QtChart创建一个简单的动态折线图&#xff…...

C++ | 虚函数

在 C 面向对象编程领域,多态性堪称核心概念,而虚函数则是实现运行时多态的关键所在。 一、虚函数的概念与作用 1.1 什么是虚函数 虚函数是 C 中用于实现动态多态的成员函数。在基类中使用virtual关键字声明虚函数后,派生类能够重写&#x…...

单元测试整理

在国外软件开发中,单元测试必不可少,但是国内并不太重视这一块,一个好的单元测试可以提前发现很多问题,也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…...

Delphi语言的软件工程

Delphi语言的软件工程 引言 在软件工程的历史长河中,Delphi语言作为一种快速应用程序开发(RAD)的工具,凭借其高效的开发环境和强大的编程能力,一直在软件开发领域占有一席之地。本文将探讨Delphi语言的历史背景、特性…...

XSS攻击(跨站脚本攻击)详解与实战

文章目录 一、什么是XSS?二、XSS分类与场景三、XSS攻击实战流程四、CTF中的XSS利用五、XSS防御方案六、绕过过滤的常见技巧七、实战练习资源 一、什么是XSS? XSS(Cross-Site Scripting) 是一种通过向网页注入恶意脚本&#xff08…...

【C++指南】类和对象(十):const成员函数

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、const成员函数的定义与语法 1. 基本语法 2. 底层原理 二、const成员函数的作用与约束…...

数值分析与科学计算导引——误差与算法举例

文章目录 第一章 数值分析与科学计算导引1.1 数值分析的对象、作用与特点数值分析的对象数值分析的作用数值分析的特点 1.2 数值计算的误差误差分类误差与有效数字数值运算的误差估计 1.3 算法举例秦九韶算法求多项式值开根号迭代算法牛顿切线加权平均的松弛技术 第一章 数值分…...

ubuntu安装docker 无法拉取问题

sudo docker run hello-world [sudo] ubuntu 的密码: Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awai…...

【C++项目】Rpc通信框架设计

目录 Rpc远程调用的思想 项目框架设计 服务端模块划分 网络通信模块 Network 应用层通信协议模块 Protocol 消息分发处理模块 Dispatcher 远程调用路由功能模块 RpcRouter ​编辑 发布订阅功能模块 Publish-Subscribe 服务注册/发现/上线/下线功能模块 Registry-Disc…...

八股取士--dockerk8s

一、Docker 基础 Docker 和虚拟机的区别是什么? 答案: 虚拟机(VM):虚拟化硬件,每个 VM 有独立操作系统,资源占用高,启动慢。Docker:容器化应用,共享宿主机内核…...

Autojs: 使用 SQLite

例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…...

思科、华为、H3C常用命令对照表

取消/关闭 思科no华为undo华三undo 查看 思科show华为display华三display 退出 思科exit华为quit华三quit 设备命名 思科hostname华为sysname华三sysname 进入全局模式 思科enable、config terminal华为system-view华三system-view 删除文件 思科delete华为delete华…...

解决 `pip is configured with locations that require TLS/SSL` 错误

问题描述 在使用 pip 安装 Python 包时,可能会遇到以下错误: WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.这意味着 Python 的 ssl 模块未正确安装或配置,导致 p…...

2025-arXiv-OmniThink:通过思考扩展机器写作的知识边界

arXiv | https://arxiv.org/abs/2501.09751 GitHub | https://github.com/zjunlp/OmniThink 项目主页 | https://zjunlp.github.io/project/OmniThink/ ModelScope 在线 Demo | https://www.modelscope.cn/studios/iic/OmniThink 摘要: 大语言模型驱动的机器写作通…...

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点&#xff1a…...

机器学习:01数学基础教程

函数 极限 按照一定次数排列的一列数:“,“,…,"…,其中u 叫做通项。 对于数列{Un}如果当n无限增大时,其通项无限接近于一个常数A,则称该数列以A为极限或称数列收敛于A,否则称数列为发散, 极限值 左…...

C盘告急别慌!保姆级教程:用WSL2自带命令把Ubuntu搬到D盘(附默认用户修复)

C盘空间告急?WSL2迁移至D盘的完整解决方案与深度优化指南 每次打开资源管理器看到C盘那刺眼的红色警告条,心跳是不是都会漏跳一拍?作为Windows开发者,我们既依赖WSL2带来的Linux开发便利,又苦于它不断蚕食宝贵的C盘空间…...

MedCLIPSeg:基于CLIP的医学图像小样本分割技术

1. 项目概述MedCLIPSeg是一种创新的医学图像分割方法,它通过结合CLIP(Contrastive Language-Image Pretraining)模型的强大视觉-语言对齐能力和分割网络的精确性,实现了在有限标注数据下的高效医学图像分割。这种方法特别适合医学…...

鸿蒙应用性能优化新思路:用Rust重写关键NAPI模块,实测提升多少?

鸿蒙应用性能优化新思路:用Rust重写关键NAPI模块的实践与实测 在移动应用开发领域,性能优化始终是开发者面临的核心挑战之一。随着鸿蒙生态的快速发展,越来越多的应用开始面临性能瓶颈问题,特别是在计算密集型和IO密集型任务场景下…...

终极指南:如何创建和管理Sourcebot搜索上下文提升代码搜索效率

终极指南:如何创建和管理Sourcebot搜索上下文提升代码搜索效率 【免费下载链接】sourcebot Sourcebot is a self-hosted tool that helps humans and agents understand your codebase. 项目地址: https://gitcode.com/gh_mirrors/sou/sourcebot Sourcebot是…...

第一章-01-初识对象

1.生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据2.在程序中设计表格,称之为:设计类(class)打印表格,称之为:创建对象填写表格,称之为:对象…...

Equalizer APO终极指南:3个简单步骤让你的电脑音频焕然一新

Equalizer APO终极指南:3个简单步骤让你的电脑音频焕然一新 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否曾经觉得电脑播放音乐时低音不够震撼?看电影时人声模糊不清&am…...

Python 爬虫反爬突破:JS 逆向混淆与加密参数破解实战

前言 在前五篇反爬专栏中,完整覆盖了浏览器指纹、硬件特征、无头伪装、访问频率等环境层反爬对抗方案,而前端 JS 加密与代码混淆,是现阶段企业级站点最高频、最难绕过的核心反爬手段。主流平台不再单纯依赖环境检测拦截爬虫,而是…...

从激光笔到工业切割头:深入浅出聊聊‘光束质量’M²因子到底是个啥?

从激光笔到工业切割头:光束质量M因子的实战解读 激光技术已经从实验室走向千家万户,无论是孩子手中的红色激光笔,还是工厂里切割金属的万瓦光纤激光器,都离不开一个关键参数——光束质量。这个看似抽象的概念,实际上决…...

终极Betaflight Configurator配置指南:从零构建专业级无人机调参环境

终极Betaflight Configurator配置指南:从零构建专业级无人机调参环境 【免费下载链接】betaflight-configurator Cross platform configuration and management application for the Betaflight firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight…...

LinkSwift:一款基于JavaScript的网盘文件下载地址获取工具

LinkSwift:一款基于JavaScript的网盘文件下载地址获取工具 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...