我正在尝试在Solr中使用以下数据来支持灵活的查询,并希望获得相同的输入。我有关于用户的数据说:
contentID (assume uuid),
platform (eg. website, mobile etc),
softwareVersion (eg. sw1.1, sw2.5, ..etc),
regionId (eg. us144, uk123, etc..)
....
还有更多其他类似的领域。此数据部分预先聚合(读取Hadoop作业):因此我们假设" contentID = uuid123和platform = mobile和softwareVersion = sw1.2和regionId = ANY"我有格式数据:
timestamp pre-aggregated data [ uniques, total]
Jan 15 [ 12, 4]
Jan 14 [ 4, 3]
Jan 13 [ 8, 7]
... ...
然后我也有更少的粒度数据说" contentID = uuid123和platform = mobile和softwareVersion = ANY和regionId = ANY(由于粒度减少,这些值将超过上表)
timestamp : pre-aggregated data [uniques, total]
Jan 15 [ 100, 40]
Jan 14 [ 45, 30]
... ...
我会收到类似" contentID = uuid123和platform = mobile"的查询,给出“uniques”的总和'对于1月15日 - 1月13日或对于" contentID = uuid123和platform = mobile和softwareVersion = sw1.2",给出总数' 1月15日 - 1月01日。
我在考虑简单的架构,其中文档就像(上面的第一个例子):
{
"contentID": "uuid12349789",
"platform" : "mobile",
"softwareVersion": "sw1.2",
"regionId": "ANY",
"ts" : "2017-01-15T01:01:21Z",
"unique": 12,
"total": 4
}
上面的第二个例子:
{
"contentID": "uuid12349789",
"platform" : "mobile",
"softwareVersion": "ANY",
"regionId": "ANY",
"ts" : "2017-01-15T01:01:21Z",
"unique": 100,
"total": 40
}
可能的优化:
{
"contentID": "uuid12349789",
"platform.mobile.softwareVersion.sw1.2.region.us12" : {
"unique": 12,
"total": 4
},
"platform.mobile.softwareVersion.sw1.2.region.ANY" : {
"unique": 100,
"total": 40
},
"ts" : "2017-01-15T01:01:21Z"
}
挑战:此类行的数量非常大,并且每个新字段都会以指数方式增长 - 例如,如果我使用上面建议的架构,我将最终为每个组合存储一个新文档内容识别,平台,softwareVersion,regionId。现在,如果我们向该文档引入另一个字段,组合数量将呈指数级增长。我已经拥有超过10亿个这样的组合行。
如果
,我希望能找到专家的意见这些行的数量非常大,肯定超过10亿(如果我们采用我建议的模式)。您会建议哪种架构符合查询要求?
仅供参考:所有查询都将与字段完全匹配(无部分或标记化),因此不需要对字段进行分析。几乎所有查询都是范围查询。
答案 0 :(得分:0)
您正在尝试存储所有可能的属性值组合的查询时间结果。那就是太多的重复数据。而是将每个观察值和属性存储为单个数据点一次。因此,如果您有'n'个观察值,并且添加了其他属性,则该属性将加法而不是指数增长。并且,如果您需要用于特定属性组合的数据,则可以在查询时对其进行过滤/汇总。
{
"contentID": "uuid12349789",
"ts" : "2017-01-15T01:01:21Z",
"observation": 10001,
"attr-platform" : "mobile",
"attr-softwareVersion": "sw1.2",
"attr-regionId": "US",
}