参考:
嵌套对象
事实上在Elasticsearch中,创建丶删除丶修改一个文档是是原子性的,因此我们可以在一个文档中储存密切关联的实体。
举例来说,我们可以在一个文档中储存一笔订单及其所有内容,或是储存一个Blog文章及其所有回应,藉由传递一个comments阵列:
PUT /my_index/blogpost/1{"title": "Nest eggs",
"body": "Making your money work...",
"tags": [
"cash",
"shares"
],"comments": [
{"name": "John Smith",
"comment": "Great article",
"age": 28,
"stars": 4,
"date": "2014-09-01"
},
{"name": "Alice White",
"comment": "More like this please",
"age": 31,
"stars": 5,
"date": "2014-10-22"
}
]
}
View Code
<1> 如果我们依靠动态映射,comments栏位会被自动建立为一个object栏位。
因为所有内容都在同一个文档中,使搜寻时并不需要连接(join)blog文章与回应,因此搜寻表现更加优异。
问题在於以上的文档可能会如下所示的匹配一个搜寻:
GET my_index/_search
{"query": {
"bool": {
"must": [
{"match": {
"comments.age": 31
}
},
{"match": {
"comments.name": "John Smith"
}
}
]
}
}
}
View Code
Alice是31岁,而不是28岁!
造成跨对象配对的原因如同我们在对象阵列中所讨论到,在于我们优美结构的JSON文档在索引中被扁平化为下方的 键-值 形式: