- 处理关联关系
- Object: 优先考虑反范式(Denormalization)
- Nested: 当数据包含多数值对象,同时有查询需求
- Child/Parent:关联文档更新非常频繁时
- 避免过多字段
- 一个文档中,最好避免大量的字段
- 过多的字段数不容易维护
- Mapping 信息保存在 Cluster State 中,数据量过大,对集群性能会有影响
- 删除或者修改数据需要reindex
- 默认最大字段数是1000,可以设置
index.mapping.total_fields.limit
限定最大字段数
- 生产环境中,尽量不要打开 Dynamic,可以使用Strict控制新增字段的加入
- true :未知字段会被自动加入
- false :新字段不会被索引,但是会保存在_source
- strict :新增字段不会被索引,文档写入失败
- 对于多属性的字段,比如cookie,商品属性,可以考虑使用Nested
- 避免正则,通配符,前缀查询
- 正则,通配符查询,前缀查询属于Term查询,但是性能不够好
- 特别是将通配符放在开头,会导致性能的灾难
- 避免空值引起的聚合不准
PUT /scores
{"mappings":{"properties":{"score":{"type":"float","null_value":0}}}}
- 为索引的 Mapping 加入 Meta 信息
- Mappings设置非常重要,需要从两个维度进行考虑
- 功能︰搜索,聚合,排序
- 性能︰存储的开销; 内存的开销; 搜索的性能
- Mappings设置是一个迭代的过程
- 加入新的字段很容易(必要时需要update_by_query)
- 更新删除字段不允许(需要Reindex重建数据)
- 最好能对 Mappings 加入 Meta 信息,更好的进行版本管理
- 可以考虑将 Mapping 文件上传 git 进行管理
PUT /my_index
{"mappings":{"_meta":{"index_version_mapping":"1.1"}}}