数据建模
  • 数据建模是创建数据模型的过程
    • 数据模型是对真实世界进行抽象描述的一种工具和方法,实现对现实世界的映射
    • 三个过程:概念模型=》逻辑模型=》数据模型
      • 数据模型:结合具体的数据库,在满足业务读写性能等需求的前提下,确定最终定义
  • 数据建模:功能需求+性能需求
    • 逻辑模型(功能需求)
      • 实体属性
      • 实体之间的关系
      • 搜索相关的配置
    • 物理模型(性能需求)
      • 索引模版
        • 分片数量
      • 索引Mapping
        • 字段配置
        • 关系处理
  • 对字段进行建模
          
    • 字段类型:
      • Text vs Keyword
        • Text
          • 用于全文本字段,文本会被Analyzer分词
          • 默认不支持聚合分析及排序。需要设置fielddata为true
        • Keyword
          • 用于id,枚举及不需要分词的文本。例如电话号码,email地址,手机号码,邮政编码,性别等
          • 适用于Filter(精确匹配),Sorting和Aggregations
        • 设置多字段类型
          • 默认会为文本类型设置成text,并且设置一个keyword的子字段
          • 在处理人类语言时,通过增加“英文”,“拼音”和“标准”分词器,提高搜索结果
      • 结构化数据
        • 数值类型
          • 尽量选择贴近的类型。例如可以用byte,就不要用long
        • 枚举类型
          • 设置为keyword。即便是数字,也应该设置成keyword,获取更加好的性能
        • 其他
          • 日期/布尔/地理信息
    • 检索
      • 如不需要检索
        • Enable设置成false
      • 如不需要检索
        • Index设置成false
      • 对需要检索的字段,可以通过如下配置,设定存储粒度
        • Index_options/Norms:不需要归一化数据时,可以关闭
    • 聚合及排序
      • 如不需要排序和聚合分析
        • Enable设置成false
      • 如不需要排序或者聚合分析
        • Doc_value/fielddata设置成false
      • 更新频繁,聚合查询频繁的keyword类型的字段
        • 推荐eager_global_ordinals设置为true
    • 额外的存储
      • 是否需要专门存储当前字段数据
      • Disable _source:节约磁盘;适用于指标型数据
        • 一般建议考虑增加压缩比
        • 无法看到_source字段,无法ReIndex 无法Upadte
        • Kibana中无法做discovery
  • 最佳实践
    • 建模建议一:如何处理关联关系

    • 建模建议二:避免过多字段
      • 一个文档中,最好避免大量的字段
        • 过多的字段数不容易维护
        • Mapping信息保存在Cluster State中,数据量过大,对集群性能会有影响(Cluster State信息需要和所有的节点同步)
        • 删除或者修改数据需要reindex
      • 默认最大字段数是1000,可以设置index.mapping.tatal_fields.limt限定最大字段数
      • Dynamic vs Strict
        • Dynamic(生产环境中,尽量不用打开Dynamic)

          • true-未知字段会被自动加入
          • false-新字段不会被索引。但是会保存在_source
          • strict-新字段不会被索引,文档写入失败
        • Strict
          • 可以控制道字段级别  
      • 当Dynamic设置为True,同时采用扁平化的设计且键值对过多会导致字段数量的膨胀,通过Nested对象保存key/value可以减少字段数量。
    • 建模建议三:避免正则查询
      • 通过 Inner Object避免低性能的正则匹配 
{
"version":{
"display_name":"7.1.0",
"marjor":7,
"minor":1,
"hot_fix":0
}
}
    • 建模建议四:避免空值引起的聚合不准确
      • 使用Null_Value解决空值的问题
    • 建模建议五:为索引的Mapping加入Meta信息便于管理
{
"mappings": {
"_meta": {
"software_version_mapping": "1.0"
}
}
}
Mapping字段的相关设置
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html
 

Elasticsearch数据建模笔记的更多相关文章

  1. [转] [Elasticsearch] 数据建模 - 处理关联关系(1)

    [Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: ...

  2. Elasticsearch 数据建模指南

    文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...

  3. ES 32 - Elasticsearch 数据建模的探索与实践

    目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...

  4. ElasticSearch 数据建模

    公号:码农充电站pro 主页:https://codeshellme.github.io 通常在使用 ES 构建数据模型时,需要考虑以下几点: 字段类型 是否需要搜索与分词 是否需要聚合与排序 是否需 ...

  5. ElasticSearch——数据建模最佳实践

    如何建模 mapping 设计非常重要,需要从两个维度进行考虑: 功能:搜索.排序.聚合 性能:存储的开锁.内存的开销.搜索的性能 mapping 注意事项: 加入新字段很容易(必要时需要 updat ...

  6. 论Elasticsearch数据建模的重要性

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484159&idx=1&sn=731562a ...

  7. Elasticsearch 6.x版本全文检索学习之数据建模

    1.什么是数据建模. 答:数据建模,英文为Data Modeling,为创建数据模型的过程.数据模型Data Mdel,对现实世界进行抽象描述的一种工具和方法,通过抽象的实体及实体之间联系的形式去描述 ...

  8. head first python菜鸟学习笔记(第七章) ——web应用之为数据建模

    问题1. #意思是从athletelist.py中导入AthleteListfrom athletelist import AthleteList 源程序代码 import pickle from a ...

  9. Cassandra数据建模

    1.  概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...

随机推荐

  1. Linux文件与目录管理,常用命令总结

    绝对路径:  以根目录 / 开始的相对路径:  相对于当前路径的写法 $PATH:  可执行文件路径的变量(出现在该变量下的文件可以在系统的任何目录下都可以执行) 获取路径的文件名:    basen ...

  2. HihoCode-1053-居民迁移

    解法: 一开始不会做,看到标签说是贪心加二分忽然就会了,二分是分的是人口最多居住点的人口,检查人口最多的居住点人口为mid是否可行.贪心是如果从左往右循环就尽量把人口往左迁移,如果从右往左循环就尽量把 ...

  3. 1022 D进制的A+B (20 分)

    题目:1022 D进制的A+B (20 分) 思路: 首先根据A.B的取值范围,可知A+B不过2^31,所以转换成进制数时的最长长度为31. 转换成进制的数存进数组,然后反向输出. 要注意和为0的情况 ...

  4. [LC] 277. Find the Celebrity

    Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...

  5. async样例

    function iniProcessDetail(isjob) { var cursor = logColl.find({}).sort({ip: 1}); var insertbolk = []; ...

  6. eclipse 设置字体与自动提示

    1.设置字体与字体大小 至此,字体与大小设置完毕. 2.设置自动提示 在输入框中输入 1-9 a-z A-Z .点击“Apply”保存. 开启JavaScript 自动提示 灰色未激活,先点击复选框激 ...

  7. python3下应用pymysql(第三卷)(数据自增-用于爬虫)

    在上卷中我说出两种方法进行数据去重自增,第一种就是在数据库的字段中设置唯一字段,二是在脚本语言中设置重复判断再添加(建议,二者同时使用,真正开发中就会用到) 话不多说先上代码 第一步: 确定那一字段的 ...

  8. 测试误区《二》 python逻辑运算和关系运算优先级

    关系运算 关系运算就是对2个对象进行比较,通过比较符判断进行比较,有6种方式. x > y 大于 x >= y 大于等于 x < y 小于 x <= y 小于等于 x = y ...

  9. IOC初始化销毁的2种实现方式

    IOC初始化销毁的2种实现方式 1.bean内调用init-method 和destroy-method 2.通过注解实现@PostConstruct 和@PreDestroy ----------- ...

  10. tf.estimator

    estimator同keras是tensorflow的高级API.在tensorflow1.13以上,estimator已经作为一个单独的package从tensorflow分离出来了.estimat ...