要不要也来分享分享一下啊

关于ES存储一种数据设计的问题

Elasticsearch | 作者 fengyouchao | 发布于2016年04月26日 | 阅读数:5816

原始文本数据有三个字段 a b c
a:字符串类型
b:表示c的值的类型, b大概有20多种类型, 假设b的值为"hello"时, c的值是一个数字, b为其他类型时, c都是字符串值

ES 存储

设计方案一:
{
"a":{"type":"string"},
"b":{"type":"string", index="no_analyzed"},
"c.long": {"type": "long"},
"c.string": {"type":"string"},
}

当b为“hello”, 把c的值存储在c.long字段中, 当b的值不为"hello"时,把c的值存储c.stirng字段
这样b中会存储很多重复值

设计方案二:
{
"a":{"type":"string"},
"b.type1": {"type":"string"},
"b.type2": {"type":"string"},
"b.type3": {"type":"string"},
"b.type4": {"type":"string"},
"b.type5": {"type":"string"},
.
.
.
.
"b.hello": {"type": "long"}
}

以b不同的值作为字段名称,当b的值为hello时, 只需要对b.hello字段进行赋值
这样就会有20多个b.*字段, 对于每条数据,这些b.*字段中只有一个字段有值

数据总量在百亿级别, 测试过方案二, 1000万条数据, 主分片占用1.8GB

请问,哪个设计方案更合理一些,或者有更好的设计方案, 还有就是,对于这样的数据量, 硬件配置要达到什么程度
已邀请:

MrLee - 测试开发

赞同来自:

我的第一想法和你的方案一基本一致,,,
 {
  "fieldA":a,
  "fieldC":{
    "typeC":"string/long"  /*如果需要关注 type 就保留,否则就不需要*/
    "valueString":"abc",
    "valueLong":123
  }
}
valueString 和 valueLong,这两个 field 必然在 ES 中都有的。

要回复问题请先登录注册