2014-04-22 84 views
0

我使用ElasticSearch作为数据存储,我想知道如何构造我的数据。来自MySQL我的天生本能是将所有东西都分成不同的类型(“表格”),但我不确定是否有任何东西可以从中获得。ElasticSearch:嵌套数组与单独类型

例如,我有一篇有评论的文章,​​我想跟踪评论中点击“喜欢”的用户。我是否应该简单地将用户标识数组保存在文章评论内的嵌套数组中,还是应该将注释移出单独的comment类型?那么喜欢评论的用户阵列又应该是一个单独的类型呢?

{ 
    "article": { 
     "properties": { 
      ... 
      "comments": { 
       "properties": { 
        ... 
        "likes": { "type": "string" } // array of UUIDs 
       } 
      } 
} 

从效率的角度来看嵌套数组嵌套数组有问题吗?使用ElasticSearch作为数据存储时,使用嵌套的数组/对象还是单独的类型更好?

+0

根据我的经验,嵌套/去规范化结构在ElasticSearch中更容易处理,即文章类型中的UUID数组。 – Sangharsh

回答

1

这是一个广泛的问题,通常的答案是“这取决于”。在规划数据结构时,我会说有两件事情需要考虑。

一种是您的访问模式 - 您将需要什么类型的搜索以及您希望在数据上使用何种聚合(如果有)。试着将你的用法映射出来,看看你可以用你想到的结构来实现它。

第二个是更新模式。这有时会被忽略,以支持访问模式,但有一些值得考虑的重要内容。例如,如果文章本身变化不大,但可以有很多评论 - 您可能会获得更好的性能,将评论作为单独的文档(和类型)保留,因为您无需对每篇评论重新编制文章。 (请记住,在Elasticsearch中更新文档实际上是将其重新编入索引)。

我也推荐看这篇文章 - http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/,并熟悉嵌套对象和父子类型之间的区别(当父类和子类有不同的更新模式时,后者更好)。