我为一个项目规划了一个数据库,该项目存储了数百万个关于用户及其机器日志的文档。
问题是:如何存储和分片这些数据?基于用户还是基于时间?
按用户编制索引我可以快速查询一位用户的百万文档,并生成许多关于他的基于时间的报告。
按时间编制索引我可以快速查询一天内的所有用户并生成有关他们的报告。
在两个方向(用户和时间)中挖掘此数据的最佳方法是什么?
我正在阅读有关分片,索引和路由的一些内容。
答案 0 :(得分:2)
您每天要存储多少个文档?您可能正在进行预优化。
一种可能的策略(基于时间的索引,用户路由):
如果您将每一天作为索引,则可以将任何基于日期的搜索限制为仅适用的索引。
然后,您可以通过userid route所有文档,因此任何基于用户的搜索都只会搜索存在该用户数据的分片。
答案 1 :(得分:2)
正如我在Sizing Elasticsearch上写的一篇文章所强调的那样,没有简单的经验法则可循。它讨论了分片和分区的各种方法以及其他要记住的事项。基于用户的路由和时间范围划分的优点和缺点都包括在内。
正如您在评论中指出的那样,您的摄取率不是很大,例如每天一个指数可以很好地工作。但这是否是一个好主意取决于你的搜索。您通常只搜索过去几天,或者用户通常会搜索他的整个历史记录?如果是这样,那么基于时间的分区实际上可能会对您不利,因为您将搜索如此多的Lucene索引。
链接的文章也引用了Shay关于这个主题的精彩演讲:https://vimeo.com/44716955