elastic stack 那些事【8】

数据建模

  1. 对现实世界进行抽象描述的工具和方法
  2. 通过抽象的实体以及实体之间的联系的形式去描述业务规则,从而实现对现实世界的映射。
  3. 概念模型

    1. 确定系统的核心需求和范围边界,设计实体和实体之间的关系
  4. 逻辑模型

    1. 进一步梳理业务需求,确定每个实体的属性 关系 约束规则
  5. 物理模型

    1. 结合具体的数据库产品,在满足业务读写性能等需求的前提下确定最终的定义
    2. mysql mongodb elasticsearch
    3. 第三范式

es中的数据建模

es 是基于lucene以倒排索引为基础实现的存储系统,不遵循关系型数据库的范式约定

mapping相关字段

  1. enable true|false 仅存储,不做搜索和聚合分析
  2. index true|false 是否构建倒排索引
  3. index_options docs|freqs|positions|offsets 存储倒排索引哪些信息
  4. norms true|false 是否存储归一化参数,如果字段仅仅用于过滤和聚合分析 可关闭
  5. doc_values true|false 是否启用doc_values 用于排序和聚合分析
  6. field_data false|true 是否为text类型启用fielddata 实现排序和聚合分析
  7. store false|true 是否存储该字段
  8. coerce true|false是否开启自动数据类型转换功能,例如字符串转为数字,浮点转为整型
  9. multifields多字段 灵活使用多字段来解决业务多样性需求
  10. dynamic true|false|strict 控制mapping自动更新
  11. date_detection true|false 是否自动识别日期类型

何种类型

  1. 字符串类型 需要分词设定为text 否设置为keyword
  2. 枚举类型 基于性能考虑将其设定为keyword类型,即便该数据为整型
  3. 数值类型 尽量选择贴近的类型,例如 byte即可表示所有数值时,选用byte 而不是long
  4. 其他类型 比如 布尔类型 日期 地理位置等

是否需要检索

  1. 完全不需要检索 排序 聚合分析 enabled设置为false
  2. 不需要检索的字段 index 设置为false
  3. 需要检索的字段 可以通过如下设置设定需要存储的粒度

    1. index_options 结合需要设定
    2. norms不需要归一化数据时关闭即可

reindex

指重建所有数据的过程 一般发生在如下情况

  1. mapping 设置变更 例如字段类型变化 分词器字典更新等
  2. index设置变更 例如 分片数更改等
  3. 迁移数据

es提供了线程api完成该工作

  1. _update_by_query 在现有索引上重建
  2. reindex 在其他索引上重建

reindex task

数据重建的时间受源索引文档规模影响 规模越大 所需时间越多 此时需要设定url参数wait_for_completion为false进行异步执行,es以task来描述任务
es提供了taskapi来查看任务执行的进度和相关数据

对mapping进行版本管理

  1. 包含在代码或者专门以文件进行管理,添加注释 加入 git等版本管理仓库中 方便回顾
  2. 为每个增加的metadata字段 在其中维护一些文档相关的元数据 方便对数据进行管理

防止字段过多

  1. 字段过多,难于维护
  2. mapping信息存储在cluster state中 过多字段导致mapping过大,最终导致变慢
  3. 听过设置index.mapping_total_fields.limit可以限定索引中最大字段数 默认 1000
  4. 可以通过key value的方式解决字段过多的问题 但是并不完美

keyvalue方式

虽然通过此种方式极大低减少field数目 但也有坏处

  1. query语句的复杂度飙升 且有一些无法实现的功能,例如聚合分析
  2. 不利于kibana分析
  3. 一般字段过多的原因时由于没有高质量的数据建模导致的 例如 dynamic 设置为true
  4. 考虑拆分多个索引解决问题

你可能感兴趣的:(java)