【问题标题】:Elasticsearch Nested-field vs Depth? Check for document depth via Kibana?Elasticsearch 嵌套字段与深度?通过 Kibana 检查文档深度?
【发布时间】:2020-08-12 18:38:10
【问题描述】:

我正在阅读elasticsearch 中的映射,我看到了这两个术语:嵌套字段和深度。我认为这两个术语是相当等价的。我目前对这两个感到困惑。请任何人都可以清除我吗?谢谢你。 顺便说一句,有什么方法可以通过 Kibana 检查文档深度?

对不起我的英语。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    混淆的根源可能是因为在 Elasticsearch 中,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

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

    nested 数据类型允许索引对象数组并通过nested query 单独查询它们的项目。这意味着 Elasticsearch 将以不同的方式索引具有此类字段的文档(有关详细说明,请参阅权威指南的 Nested Objects 页)。

    例如,如果在下面的示例中我们没有在映射中将"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)。要自定义它,您可以查看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"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

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

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

    您很可能可以使用脚本来执行此操作,请查看此博客文章了解更多详细信息:Using Painless in Kibana scripted fields

    【讨论】:

    • 谢谢,这有助于我更好地理解,ES 文档太可怕了。我确实不得不在网上挖掘如何更改设置,在这里我找到了让你免于搜索的地方:stackoverflow.com/questions/59484227/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多