ElasticSearch数据建模

文章目录

如何处理关联关系

  • Object: 优先考虑反范式(Denormalization)

  • Nested: 当数据包含多数值对象,同时有查询需求

  • Child/Parent:关联文档更新非常频繁时

避免过多字段

  • 一个文档中,最好避免大量的字段

    • 过多的字段数不容易维护
    • Mapping 信息保存在Cluster State 中,数据量过大,对集群性能会有影响
    • 删除或者修改数据需要reindex
  • 默认最大字段数是1000,可以设置index.mapping.total_fields.limit限定最大字段数。·

思考:什么原因会导致文档中有成百上千的字段?

生产环境中,尽量不要打开 Dynamic,可以使用Strict控制新增字段的加入

  • true :未知字段会被自动加入
  • false :新字段不会被索引,但是会保存在_source
  • strict :新增字段不会被索引,文档写入失败

对于多属性的字段,比如cookie,商品属性,可以考虑使用Nested

避免正则/通配符/前缀查询

正则,通配符查询,前缀查询属于Term查询,但是性能不够好。特别是将通配符放在开头,会导致性能的灾难

案例:针对版本号的搜索,我们一般会对版本号进行模糊查询,优化方式将一个版本号字段变为保存Object对象类型,其实就是拆分为多个字段,

bash 复制代码
# 将字符串转对象
PUT softwares/
{
  "mappings": {
    "properties": {
      "version": {
        "properties": {
          "display_name": {
            "type": "keyword"
          },
          "hot_fix": {
            "type": "byte"
          },
          "marjor": {
            "type": "byte"
          },
          "minor": {
            "type": "byte"
          }
        }
      }
    }
  }
}


#写入多个文档
PUT softwares/_doc/1
{
  "version": {
    "display_name": "7.1.0",
    "marjor": 7,
    "minor": 1,
    "hot_fix": 0
  }
}

PUT softwares/_doc/2
{
  "version": {
    "display_name": "7.2.0",
    "marjor": 7,
    "minor": 2,
    "hot_fix": 0
  }
}

PUT softwares/_doc/3
{
  "version": {
    "display_name": "7.2.1",
    "marjor": 7,
    "minor": 2,
    "hot_fix": 1
  }
}


# 通过 bool 查询,
POST softwares/_search
{
  "query": {
    "bool": {
      "filter": [
        { "match": { "version.marjor": 7 } },
        { "match": { "version.minor": 2 } }
      ]
    }
  }
}

避免空值引起的聚合不准

字段的值如果为null,那么就会导致对该字段进行聚合操作得到的结果不准确。因为聚合操作会把为null的文档忽略掉。

比如有5名学生,它们的成绩分别为100、null、null、99、98。此时如果计算平均值那么结果是(100+99+98)/3 ,但是我们期望的是(100+99+98+0+0)/5

我们可以在创建索引时,为这个字段指定 null_value 属性,如果为null就给一个默认值

bash 复制代码
DELETE scores
# 创建索引,未指定null_value
PUT /scores
{
  "mappings": {
      "properties": {
        "score": {
          "type": "float",
          "null_value": 0
        }
      }
    }
}

# 创建三个文档
PUT /scores/_doc/1
{"score":100}
PUT /scores/_doc/2
{"score":null}
PUT /scores/_doc/3
{"score":100}

# 求平均值
POST /scores/_search
{
  "size": 5,
  "aggs": {
    "hs_avg": {
      "avg": {
        "field": "score"
      }
    }
  }
}

补充:

为索引的Mapping加入Meta 信息

  • Mappings设置非常重要,需要从两个维度进行考虑

    • 功能︰搜索,聚合,排序
    • 性能︰存储的开销; 内存的开销; 搜索的性能
  • Mappings设置是一个迭代的过程

    • 加入新的字段很容易(必要时需要update_by_query)
    • 更新删除字段不允许(需要Reindex重建数据)
    • 最好能对Mappings 加入Meta 信息,更好的进行版本管理
    • 可以考虑将Mapping文件上传git进行管理
bash 复制代码
PUT /my_index
{
  "mappings": {
    "_meta": {
      "index_version_mapping": "1.1"
    }
  }
}
相关推荐
2601_964840278 小时前
4G云门禁普惠化技术实践:基于边缘计算破解成本、隐私、部署三大行业瓶颈
大数据·人工智能·边缘计算
具身智能进化论8 小时前
国产协作机器人品牌如何选择,企业长期使用更看重什么
大数据·人工智能·机器人·工厂方法模式
IvorySQL9 小时前
PostgreSQL 日报|PG18.5 回归测试崩溃问题(8 月 12 日)
大数据·数据库·人工智能·postgresql
明航咨询_贾老师9 小时前
《软件工程造价师报考全攻略:报名条件、考试流程与通关要点》
大数据·软件工程造价师
2503_9317124810 小时前
国内广东乐运科技及行业头部AI数字化转型解决方案源头
大数据
学着改变27510 小时前
手持式超声波流量计为何首选行澳科技?便携巡检与外夹计量的性能标杆
大数据·网络·人工智能·科技·产品运营·量子计算
xushichang123_11 小时前
企业想统一接入 Claude、GPT、DeepSeek、Qwen 等模型,应该选什么云上 AI 平台架构?
大数据
赟爸12 小时前
直播切片素材杂乱不好复用,易元AI要怎么处理
大数据·人工智能·python
yunlaodacom12 小时前
阿里云国际站注册:性能损耗 < 1%!基于 eBPF 的服务器异常预测实战与调优指南
大数据·服务器·阿里云
大大大大晴天13 小时前
从 Kafka 到报表:Flink、CDC 与 StarRocks 的实时入仓链路
大数据