我应该使用嵌套对象还是普通字段?

时间:2013-01-16 17:32:01

标签: elasticsearch

我一直在尝试使用Elasticsearch,在研究一个单独的问题时我遇到了this question.这里,swatkins询问有关查询嵌套对象的问题,并且响应者指出嵌套对象不是必需的他的模特。我在这里复制了模型,并进行了一些更改以反映我的特定问题:

[{
    id:4635,
    description:"This is a test description",
    author:"John",
    author_id:51421,
    meta: {
        title:"This is a test title for a video",
        description:"This is my video description",
        url:"/url_of_video"
        awesomeness-level: "pretty-awesome"
        kung-fu: true
    }
},
{
    id:4636,
    description:"This is a test description 2",
    author:"John",
    author_id:51421,
    meta: {
        title:"This is an example title for a video",
        description:"This is my video description2",
        url:"/url_of_video2"
        kung-fu:false
        monsters:true
        monsters-present: "Dracula, The Mummy"
    }
}]

我们的应用程序允许用户定义自定义元数据,因此我们使用嵌套对象来表示该数据。乍一看,它看起来类似于swatkins的模型,所以我想也许我们不应该使用嵌套对象。

最大的区别是每个对象元可能不同,注意第二个视频具有关于“怪物电影”的元,而第一个视频引用了“超级级别”。那么,我应该使用嵌套对象,还是只将元数据映射为普通字段?如果我们执行后者,第一个视频是否会有空的元数据字段?这真的重要吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

假设您的示例代表两个elasticsearch文档,看起来您不需要使meta成为嵌套对象。当一个父对象具有多个嵌套对象并且您的搜索涉及嵌套对象的多个字段时,使用嵌套对象是有意义的。例如,如果您有这样的记录:

{
  "name": "apple",
  "attributes": [
     {
       "color": "yellow",
       "size": "big"
     },
     {
       "color": "red",
       "size": "small"
     }
  ]
}

并且您希望在搜索color:yellow AND shape:bigcolor:red AND shape:small时找到此记录但不希望在搜索color:yellow AND shape:small时返回此记录,这是有意义的attributes嵌套对象。它允许您独立索引和搜索每个属性,然后获取匹配属性的父对象。