造成混淆的原因可能是因为Elasticsearch术语
nested可以在两种不同的上下文中使用:
- “嵌套”为嵌套的常规JSON表示法,即JSON对象中的JSON对象;
- “嵌套”为Elasticsearch
nested
数据类型。
在映射文档页面中,当提及“深度”时,它们指的是第一个含义。这里的设置
index.mapping.depth.limit定义了JSON文档可以嵌套的深度。
Elasticsearch映射如何解释JSON深度?
这是深度为1的JSON文档的示例:
{ "name": "John", "age": 30 }现在深度2:
{ "name": "John", "age": 30, "cars": { "car1": "Ford", "car2": "BMW", "car3": "Fiat" } }默认情况下(从ES
6.3开始),深度不能超过20。
什么是nested
数据类型?为什么它与深度> 1的文档不同?
nested数据类型允许索引对象数组并通过
nestedquery分别查询其项目。这意味着Elasticsearch将以不同的方式对具有此类字段的文档编制索引(有关更多说明,请参见《权威指南》的“
嵌套对象 ”页面)。
例如,如果在下面的例子中,我们没有定义
"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
吗?
是的你可以!只是为了消除这种混乱,是的,您可以在映射中的
nestedfield内部定义一个field
nested。它看起来像这样:
PUT my_index{ "mappings": { "_doc": { "properties": { "user": { "type": "nested", "properties": { "name": { "type": "keyword" }, "cars": { "type": "nested", "properties": { "brand": { "type": "keyword" } } } } } } } }}但是请记住,要建立索引的隐式文档的数量将成倍增加,并且效率不高。
我可以从Kibana获取JSON对象的深度吗?
您很有可能可以使用脚本来完成此操作,请查看此博客文章以获取更多详细信息:在Kibana脚本字段中使用Painless。
希望有帮助!



