代码之家  ›  专栏  ›  技术社区  ›  Tiến Nguyễn Hoàng

ElasticSearch嵌套场与深度?通过Kibana检查文档深度?

  •  2
  • Tiến Nguyễn Hoàng  · 技术社区  · 8 年前

    我在读地图 elasticsearch 我看到这两个术语:嵌套字段和深度。我认为这两个术语是相当等价的。我现在对这两个感到困惑。有人能把我弄出去吗?谢谢您。 顺便问一句,有没有办法通过Kibana检查文档深度?

    对不起我的英语。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Nikolay Vasiliev    8 年前

    困惑的根源可能是因为在弹性搜索术语中 nested 可以在两种不同的上下文中使用:

    mappings documentation page 当他们提到“深度”时,他们指的是第一个含义。这里是布景 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开始)深度 cannot exceed 20 .

    什么是 嵌套的 数据类型,为什么它与深度为1的文档不同?

    nested 数据类型允许对对象数组进行索引,并通过 nested query . 这意味着ElasticSearch将以不同的方式对具有这些字段的文档进行索引(请参见页面 Nested Objects 更多的解释)。

    例如,如果在下面的示例中我们没有定义 "user" 作为 嵌套的 映射中的字段,查询 user.first: John user.last: White 将返回一场比赛,这将是一个错误:

    {
      "group" : "fans",
      "user" : [ 
        {
          "first" : "John",
          "last" :  "Smith"
        },
        {
          "first" : "Alice",
          "last" :  "White"
        }
      ]
    }
    

    如果我们这样做,ElasticSearch将为 “用户” 作为隐式子文档列出,这样将使用更多的资源、更多的磁盘和内存。这就是为什么映射上还有另一个设置: index.mapping.nested_fields.limit 调节有多少不同 嵌套的 可以声明的字段(默认为 50 )

    因此,深度为1的ElasticSearch文档不作为 嵌套的 除非你明确要求它这么做,这就是区别。

    我能要吗 嵌套的 内部字段 嵌套的 ?

    是的,你可以!为了避免这种混淆,可以定义 嵌套的 内部字段 嵌套的 映射中的字段。它看起来像这样:

    PUT my_index
    {
      "mappings": {
        "_doc": {
          "properties": {
            "user": {
              "type": "nested",
              "properties": {
                "name": {
                  "type": "keyword"
                },
                "cars": {
                  "type": "nested",
                  "properties": {
                    "brand": {
                      "type": "keyword"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    但是请记住,要索引的隐式文档的数量将会成倍增加,而且效率也不会那么高。

    我可以从kibana获取JSON对象的深度吗?

    最有可能的是,你可以通过脚本来完成,请查看此博客文章了解更多详细信息: Using Painless in Kibana scripted fields .

    希望有帮助!