什么是数据建模?
为了充分利用 Elasticsearch,你需要了解它的工作机制,以及如何让它如你所需的进行工作。
和专用的关系型数据存储有所不同,Elasticsearch 并没有对处理实体之间的关系给出直接的方法。 一个关系数据库的黄金法则是 --规范化你的数据(范式)-- 但这不适用于 Elasticsearch。 在 关联关系处理 、 嵌套对象 和 父-子关系文档 我们讨论了这些提供的方法的优点和缺点。
然后在 扩容设计 我们谈论 Elasticsearch 提供的快速、灵活的扩容能力。 当然扩容并没有一个放之四海而皆准的方案。你需要考虑这些通过系统产生的数据流的具体特点, 据此设计你的模型。例如日志事件或者社交网络流这些时间序列数据类型,和静态文档集合在处理模型上有着很大的不同。
创建数据模型的过程:概念模型=》逻辑模型=》数据模型
数据模型:结合具体的数据库,在满足业务读写性能要求下,确定最终定义
数据建模主要从两个维度来考量:功能需求+性能需求
如何对字段进行建模
字段类型:text vs keyword
text :会被全文本分词,默认不支持聚合分析及排序(需要设置filedata=true)
keyword: 用于id枚举不需要分词的文本。
例如电话号码,email
适用于filter精确匹配 sorting 和 aggs
设置多字段类型:
默认会为文本类型设置text,并且设置一个keyword子字段
结构化数据:
数值类型:尽量选贴近类型,例如可以用byte就不要用long
枚举类型:设置为keyword,即便是数字也设置成keyword获取更好的性能
检索
如果不需要检索,就把index设置false
对需要检索字段可以通过如下配置,设定存储颗粒度:index_option / norms 不需要归一化数据,可以关闭达到节省存储空间。
聚合和排序
如不需要排序检索聚合分析,把enable设置false
如不需要排序或者聚合分析,把doc_values / filedata 设置false
更新频繁,聚合查询频繁keyword字段类型,建议把eager_global_ordinals设置true,帮助你很好的利用缓存。
额外的存储
是否需要专门存储当前字段数据:store 设置true 可以存储该字段的原始内容,一般结合_source的enable为false时候使用。
关闭_source 节约磁盘,适用于指标形数据:一般建议考虑增加压缩比,关闭_source导致无法reindex 和 update。
案例解析:
解决网络传输过大问题:
虽然找到了结果,但是_source字段看不到了。
通过指定stored_fields字段,来获取文档数据