ElasticSearch:嵌套数组与单独类型

时间:2014-04-22 12:07:31

标签: arrays types elasticsearch

我正在使用ElasticSearch作为数据存储,我想知道如何构建我的数据。来自MySQL我的本能是将所有东西分成不同的类型(“表格”),但我不确定是否有任何东西可以从中获得。

例如,我有一篇包含评论的文章,​​我想跟踪在评论中点击“赞”的用户。我应该简单地将用户ID数组保留在文章注释中的嵌套数组中,还是应该将注释移到单独的comment类型中?那些喜欢评论的用户应该是一个单独的类型呢?

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

从效率角度看嵌套数组中嵌套数组是否存在问题?当使用ElasticSearch作为数据存储时,使用嵌套数组/对象或单独类型是否更好?

1 个答案:

答案 0 :(得分:1)

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

一种是您的访问模式 - 您将需要哪些类型的搜索,以及您希望在数据上使用哪种聚合(如果有)。尝试映射您的用途,看看您是否可以通过您想到的结构来实现它。

第二个是更新模式。这有时会被忽视,有利于访问模式,但有一些重要的含义值得考虑。例如,如果文章本身没有太大变化,但它可以有很多评论 - 您可能会获得更好的表现,将评论作为单独的文档(和类型)保存,因为您不需要重新索引文章在每个评论。 (请记住,在Elasticsearch中更新文档实际上是重新索引它。)

我还建议查看本文 - http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/并熟悉嵌套对象和父子类型之间的区别(当父级和子级具有不同的更新模式时,后者会更好。) / p>