elasticsearch,Arrays,Types,elasticsearch" /> elasticsearch,Arrays,Types,elasticsearch" />

Arrays ElasticSearch:嵌套数组与单独类型

Arrays ElasticSearch:嵌套数组与单独类型,arrays,types,elasticsearch,Arrays,Types,elasticsearch,我使用ElasticSearch作为数据存储,我想知道如何构造我的数据。来自MySQL,我的本能是将所有内容分成不同的类型(“表”),但我不确定是否能从中获得任何好处 例如,我有一篇文章中有评论,我想跟踪在评论中单击“喜欢”的用户。我应该简单地将用户ID数组保存在文章注释内的嵌套数组中,还是将注释移出到单独的comment类型中?那么那些喜欢该评论的用户又该怎么办呢?这应该是一种单独的类型吗 { "article": { "properties": {

我使用ElasticSearch作为数据存储,我想知道如何构造我的数据。来自MySQL,我的本能是将所有内容分成不同的类型(“表”),但我不确定是否能从中获得任何好处

例如,我有一篇文章中有评论,我想跟踪在评论中单击“喜欢”的用户。我应该简单地将用户ID数组保存在文章注释内的嵌套数组中,还是将注释移出到单独的
comment
类型中?那么那些喜欢该评论的用户又该怎么办呢?这应该是一种单独的类型吗

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

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

这是一个广泛的问题,通常的答案是“视情况而定”。我认为在规划数据结构时需要考虑两件事。 一个是您的访问模式—您需要什么类型的搜索,以及您希望对数据进行什么类型的聚合(如果有)。试着描绘你的用途,看看你能用你心目中的结构来实现它

第二个是更新模式。这在访问模式中有时被忽略,但有一些重要的影响值得考虑。例如,如果文章本身没有太大变化,但它可以有很多注释,那么将注释作为单独的文档(和类型)保存可能会获得更好的性能,因为您不需要对每个注释重新编制文章索引。(请记住,在Elasticsearch中更新文档实际上是对其重新编制索引)


我还建议阅读这篇文章,熟悉嵌套对象和父子类型之间的区别(当父对象和子对象具有不同的更新模式时,后者更好)。

根据我的经验,嵌套/非规范化结构更容易在ElasticSearch中处理,即,项目类型中的UUID数组。