小编典典

Elasticsearch嵌套字段与深度?通过Kibana检查文档深度?

elasticsearch

我正在阅读有关Elasticsearch中的映射的信息,并且看到了以下两个术语:嵌套字段和深度。我认为这两个词相当。我目前对这2个内容感到困惑。请问有人可以清除我吗?谢谢。顺便说一句,有什么方法可以通过Kibana检查文档深度吗?

对不起我的英语不好。


阅读 444

收藏
2020-06-22

共1个答案

小编典典

造成混淆的原因可能是因为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: Johnuser.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

希望有帮助!

2020-06-22