数据建模
- 对事实世界进行形象形容的工具和办法
- 通过形象的实体以及实体之间的分割的模式去形容业务规定,从而实现对事实世界的映射。
概念模型
- 确定零碎的外围需要和范畴边界,设计实体和实体之间的关系
逻辑模型
- 进一步梳理业务需要,确定每个实体的属性 关系 束缚规定
物理模型
- 联合具体的数据库产品,在满足业务读写性能等需要的前提下确定最终的定义
- 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
- 思考拆分多个索引解决问题