我正在使用ElasticSearch作为数据存储,我想知道如何构建我的数据。来自MySQL我的本能是将所有东西分成不同的类型(“表格”),但我不确定是否有任何东西可以从中获得。
例如,我有一篇包含评论的文章,我想跟踪在评论中点击“赞”的用户。我应该简单地将用户ID数组保留在文章注释中的嵌套数组中,还是应该将注释移到单独的comment
类型中?那些喜欢评论的用户应该是一个单独的类型呢?
{
"article": {
"properties": {
...
"comments": {
"properties": {
...
"likes": { "type": "string" } // array of UUIDs
}
}
}
从效率角度看嵌套数组中嵌套数组是否存在问题?当使用ElasticSearch作为数据存储时,使用嵌套数组/对象或单独类型是否更好?
答案 0 :(得分:1)
这是一个广泛的问题,通常的答案是"它取决于"。我想说在规划数据结构时需要考虑两件事。
一种是您的访问模式 - 您将需要哪些类型的搜索,以及您希望在数据上使用哪种聚合(如果有)。尝试映射您的用途,看看您是否可以通过您想到的结构来实现它。
第二个是更新模式。这有时会被忽视,有利于访问模式,但有一些重要的含义值得考虑。例如,如果文章本身没有太大变化,但它可以有很多评论 - 您可能会获得更好的表现,将评论作为单独的文档(和类型)保存,因为您不需要重新索引文章在每个评论。 (请记住,在Elasticsearch中更新文档实际上是重新索引它。)
我还建议查看本文 - http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/并熟悉嵌套对象和父子类型之间的区别(当父级和子级具有不同的更新模式时,后者会更好。) / p>