elastic search中如何对字段进行建模
1. 选择字段类型
2. 是否需要搜索
- 如不需要检索,排序和聚合分析,Enable设置成false
- 如不需要检索,index设置成false
- 对需要存储的字段,可以通过如下配置,设定存储粒度
- index_optioins/Norms:不需要归一化数据时,可以关闭
3. 是否需要聚合及排序
- 如不需要检索,排序和聚合分析,Enable设置成false
- 如不需要排序或者聚合分析功能,Doc_values / fielddata设置成false
- 更新频繁,聚合查询频繁的keyword类型的字段
- 推荐将eager_global_ordinals设置为true
4. 额外的存储
disable _source:节约磁盘
造成的结果:
- 无法做reindex,无法做update
- kibana中无法做discovery
建议
1. 避免过多字段
Mapping 信息保存在Cluster State 中,数据量过大,对集群性能会有影响(Cluster
State 信息需要和所有的节点同步)
默认最大字段数是1000,可以设置index.mapping.total_fields.limt 限定最大字段数。
2. 避免正则查询
正则,通配符查询,前缀查询属于Term 查询,但是性能不够好
特别是将通配符放在开头,会导致性能的灾难
案例:
错误的将网址映射成 keyword,然后用通配符查询。应该使用 Text,结合 URL 分词器
案例:文档中某个字段包含了了Elasticsearch 的版本信息,例如version: “7.1.0”
搜索所有是bug fix 的版本?每个主要版本号所关联的文档?
解决方案:将单个字符串转换为对象
搜索的时候采用filter
3. 避免空值引起的聚合不准
使用Null_Value 解决空值的问题
4. 为索引的Mapping 加入Meta 信息
Mappings 设置非常重要,需要从两个维度进行考虑
- 功能:搜索、聚合、排序
- 性能:存储的开销;内存的开销;搜索的性能
Mappings 设置是一个迭代的过程
- 加入新的字段很容易(必要时需要update_by_query)
- 更新、删除字段不允许(需要Reindex 重建数据)
- 最好能对Mappings 加入Meta 信息,更好的进行版本管理
- 可以考虑将Mapping 文件上传git 进行管理
参考:极客时间 阮老师 es课程