我正在阅读有关elasticsearch中的映射的信息,我看到以下两个术语:嵌套字段和深度。我认为这两个词相当。我目前对这2个内容感到困惑。请问有人可以清除我吗?谢谢。 顺便说一句,有什么方法可以通过Kibana检查文档深度吗?
对不起,我的英语。
答案 0 :(得分:3)
造成混淆的原因可能是因为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
)。
因此,除非您明确要求深度大于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。
希望有帮助!