原始文本数据有三个字段 a b c
a:字符串类型
b:表示c的值的类型, b大概有20多种类型, 假设b的值为"hello"时, c的值是一个数字, b为其他类型时, c都是字符串值
ES 存储
设计方案一:
当b为“hello”, 把c的值存储在c.long字段中, 当b的值不为"hello"时,把c的值存储c.stirng字段
这样b中会存储很多重复值
设计方案二:
以b不同的值作为字段名称,当b的值为hello时, 只需要对b.hello字段进行赋值
这样就会有20多个b.*字段, 对于每条数据,这些b.*字段中只有一个字段有值
数据总量在百亿级别, 测试过方案二, 1000万条数据, 主分片占用1.8GB
请问,哪个设计方案更合理一些,或者有更好的设计方案, 还有就是,对于这样的数据量, 硬件配置要达到什么程度
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
请问,哪个设计方案更合理一些,或者有更好的设计方案, 还有就是,对于这样的数据量, 硬件配置要达到什么程度
1 个回复
MrLee - 测试开发
赞同来自:
{
"fieldA":a,
"fieldC":{
"typeC":"string/long" /*如果需要关注 type 就保留,否则就不需要*/
"valueString":"abc",
"valueLong":123
}
}
valueString 和 valueLong,这两个 field 必然在 ES 中都有的。