数据建模
- 对现实世界进行抽象描述的工具和方法
- 通过抽象的实体以及实体之间的联系的形式去描述业务规则,从而实现对现实世界的映射。
概念模型
- 确定系统的核心需求和范围边界,设计实体和实体之间的关系
逻辑模型
- 进一步梳理业务需求,确定每个实体的属性 关系 约束规则
物理模型
- 结合具体的数据库产品,在满足业务读写性能等需求的前提下确定最终的定义
- mysql mongodb elasticsearch
- 第三范式
es中的数据建模
es 是基于lucene以倒排索引为基础实现的存储系统,不遵循关系型数据库的范式约定
mapping相关字段
- enable true|false 仅存储,不做搜索和聚合分析
- index true|false 是否构建倒排索引
- index_options docs|freqs|positions|offsets 存储倒排索引哪些信息
- norms true|false 是否存储归一化参数,如果字段仅仅用于过滤和聚合分析 可关闭
- doc_values true|false 是否启用doc_values 用于排序和聚合分析
- field_data false|true 是否为text类型启用fielddata 实现排序和聚合分析
- store false|true 是否存储该字段
- coerce true|false是否开启自动数据类型转换功能,例如字符串转为数字,浮点转为整型
- multifields多字段 灵活使用多字段来解决业务多样性需求
- dynamic true|false|strict 控制mapping自动更新
- date_detection true|false 是否自动识别日期类型
何种类型
- 字符串类型 需要分词设定为text 否设置为keyword
- 枚举类型 基于性能考虑将其设定为keyword类型,即便该数据为整型
- 数值类型 尽量选择贴近的类型,例如 byte即可表示所有数值时,选用byte 而不是long
- 其他类型 比如 布尔类型 日期 地理位置等
是否需要检索
- 完全不需要检索 排序 聚合分析 enabled设置为false
- 不需要检索的字段 index 设置为false
需要检索的字段 可以通过如下设置设定需要存储的粒度
- index_options 结合需要设定
- norms不需要归一化数据时关闭即可
reindex
指重建所有数据的过程 一般发生在如下情况
- mapping 设置变更 例如字段类型变化 分词器字典更新等
- index设置变更 例如 分片数更改等
- 迁移数据
es提供了线程api完成该工作
- _update_by_query 在现有索引上重建
- reindex 在其他索引上重建
reindex task
数据重建的时间受源索引文档规模影响 规模越大 所需时间越多 此时需要设定url参数wait_for_completion为false进行异步执行,es以task来描述任务
es提供了taskapi来查看任务执行的进度和相关数据
对mapping进行版本管理
- 包含在代码或者专门以文件进行管理,添加注释 加入 git等版本管理仓库中 方便回顾
- 为每个增加的metadata字段 在其中维护一些文档相关的元数据 方便对数据进行管理
防止字段过多
- 字段过多,难于维护
- mapping信息存储在cluster state中 过多字段导致mapping过大,最终导致变慢
- 听过设置index.mapping_total_fields.limit可以限定索引中最大字段数 默认 1000
- 可以通过key value的方式解决字段过多的问题 但是并不完美
keyvalue方式
虽然通过此种方式极大低减少field数目 但也有坏处
- query语句的复杂度飙升 且有一些无法实现的功能,例如聚合分析
- 不利于kibana分析
- 一般字段过多的原因时由于没有高质量的数据建模导致的 例如 dynamic 设置为true
- 考虑拆分多个索引解决问题
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。