Elasticsearch Nested datatype 嵌套数据类型

nested 嵌套数据类型

nested类型是object数据类型的专用版本,它允许可以彼此独立地查询对象地方式,对对象数组进行索引。

在使用大量地嵌套键值对进行存取时,可以考虑使用flattened数据类型(允许将整个JSON对象索引为单个字段)替代,该数据类型将整个对象映射为单个字段,并允许对其内容进行简单搜索。嵌套文档,存储和查询通常很昂贵,因此此用例中使用flattened数据类型是更好的选择。

Flattened 是付费使用功能

使用嵌套数据类型

如果需要索引对象数组并保持数组中每个对象地独立性,使用nested数据类型而不是object数据类型。在内部,嵌套数据类型阵列作为一个单独地隐藏文档中。这就意味着,嵌套对象在搜索时,可以独立于其他嵌套搜索之外。

使用示例

PUT my_index
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      }
    }
  }
}

PUT my_index/_doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "Smith" }} 
          ]
        }
      }
    }
  }
}

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "White" }} 
          ]
        }
      },
      "inner_hits": { 
        "highlight": {
          "fields": {
            "user.first": {}
          }
        }
      }
    }
  }
}

说明

  1. user字段为嵌套字段
  2. 第一个查询,没有匹配结果, 是因为 Alice, Smith没在一个嵌套对象内部
  3. 第二个查询,有匹配结果

嵌套查询

详情请看

限制条件

如上所述,每个嵌套对象都被索引为一个单独地Lucene文档。就上面地示例而言,如果我们为包含100个user对象的单个文档建立索引,则将创建101个Lucene文档:一个用于父文档,一个用于每个嵌套对象。由于与nested映射相关的开销,Elasticsearch放置了适当的设置来防范性能问题:
index.mapping.nested_fields.limit,在索引中,嵌套对象地最大数量。建议,仅在需要的地方使用嵌套数据类型。默认为50
index.mapping.nested_objects.limit,单个文档所有嵌套类型包含的最大JSON对象地量,当包含大量的嵌套对象时,此限制有助于防止出现内存不足的异常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章