【发布时间】:2020-08-12 18:38:10
【问题描述】:
我正在阅读elasticsearch 中的映射,我看到了这两个术语:嵌套字段和深度。我认为这两个术语是相当等价的。我目前对这两个感到困惑。请任何人都可以清除我吗?谢谢你。 顺便说一句,有什么方法可以通过 Kibana 检查文档深度?
对不起我的英语。
【问题讨论】:
标签: elasticsearch
我正在阅读elasticsearch 中的映射,我看到了这两个术语:嵌套字段和深度。我认为这两个术语是相当等价的。我目前对这两个感到困惑。请任何人都可以清除我吗?谢谢你。 顺便说一句,有什么方法可以通过 Kibana 检查文档深度?
对不起我的英语。
【问题讨论】:
标签: elasticsearch
混淆的根源可能是因为在 Elasticsearch 中,nested 可以在两种不同的上下文中使用:
nested data type。在mappings documentation page 中,当他们提到“深度”时,他们指的是第一个含义。这里的设置index.mapping.depth.limit 定义了您的 JSON 文档的嵌套深度。
以下是深度为 1 的 JSON 文档示例:
{
"name": "John",
"age": 30
}
现在深度为 2:
{
"name": "John",
"age": 30,
"cars": {
"car1": "Ford",
"car2": "BMW",
"car3": "Fiat"
}
}
默认情况下(从 ES 6.3 开始)深度 cannot exceed 20。
nested 数据类型,为什么它与深度>1 的文档不同?nested 数据类型允许索引对象数组并通过nested query 单独查询它们的项目。这意味着 Elasticsearch 将以不同的方式索引具有此类字段的文档(有关详细说明,请参阅权威指南的 Nested Objects 页)。
例如,如果在下面的示例中我们没有在映射中将"user" 定义为nested 字段,则对user.first: John 和user.last: White 的查询将返回匹配项,这将是一个错误:
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
如果我们这样做,Elasticsearch 会将"user" 列表中的每个项目作为隐式子文档进行索引,因此将使用更多资源、更多磁盘和内存。这就是为什么在映射上还有另一个设置:index.mapping.nested_fields.limit 规定可以声明多少个不同的nested 字段(默认为50)。要自定义它,您可以查看this answer。
因此,深度 > 1 的 Elasticsearch 文档不会被索引为 nested,除非您明确要求它这样做,这就是区别。
nested 中包含nested 字段吗?是的,你可以!只是为了阻止这种混乱,是的,您可以在映射中的 nested 字段内定义一个 nested 字段。它看起来像这样:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"user": {
"type": "nested",
"properties": {
"name": {
"type": "keyword"
},
"cars": {
"type": "nested",
"properties": {
"brand": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
但请记住,要索引的隐式文档的数量会成倍增加,而且效率不会那么高。
您很可能可以使用脚本来执行此操作,请查看此博客文章了解更多详细信息:Using Painless in Kibana scripted fields。
【讨论】: