elasticsearch的mapping映射类型和字段限制,通过建立索引模板达到字段映射匹配的要求

作者: admin 分类: ELK 发布时间: 2019-05-05 22:10  阅读: 325 views

elasticsearch映射是定义文档及其包含的字段的存储和索引方式的过程。可以使用映射来定义
1. 应将那些字符串字段视为全文字段。
2. 那些字段包含数字、日期或地理位置
3. 日期值格式
4. 自定义规则用于动态添加字段的映射

映射类型包括元字段和属性字段
元字段,用于自定义文档的元数据关联的处理方式。包括文档的_index,_type,_id,_source字段。
属性字段,包含于文档相关的字段或属性列表。

每个字段都有一个字段类型,可以是一个简单的类型,如text,keyword,date,long,double,boolean或ip
支持JSON的分层特性的类型,如对象或嵌套。
或者像geo_point,geo_shape或completion这样的特殊类型。
为不同目的以不同方式索引相同字段通常很有用。例如,字符串字段可以被索引为用于全文搜索的文本字段,以及用于排序或聚合的关键字字段。或者,您可以使用标准分析器,英语分析器和法语分析器索引字符串字段。

 

防止映射爆炸的设置
索引中定义太多字段是一种可能导致映射爆炸的情况,这可能导致内存不足错误和难以恢复的情况。这个问题可能比预期更常见。例如,考虑插入的每个新文档引入新字段的情况。这在动态映射中非常常见。每次文档包含新字段时,这些字段最终都会出现在索引的映射中。这并不需要担心少量数据,但随着映射的增加,它可能会成为一个问题。以下设置允许您限制可手动或动态创建的字段映射的数量,以防止错误的文档导致映射爆炸:

index.mapping.total_fields.limit
索引中的最大字段数。字段和对象映射以及字段别名都计入此限制。默认值为1000。
index.mapping.depth.limit
字段的最大深度,以内部对象的数量来衡量。例如,如果所有字段都在根对象级别定义,则深度为1.如果有一个对象映射,则深度为2,等等。默认值为20。
index.mapping.nested_fields.limit
索引中嵌套字段的最大数量,默认为50.索引1个包含100个嵌套字段的文档实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档。
index.mapping.nested_objects.limit
跨所有嵌套字段的单个文档中嵌套json对象的最大数量,默认为10000.在嵌套字段中使用100个对象的数组索引一个文档,实际上将创建101个文档,因为每个嵌套对象将作为单独的索引编制索引隐藏文件。
index.mapping.field_name_length.limit
设置字段名称的最大长度。默认值为Long.MAX_VALUE(无限制)。此设置实际上不是解决映射爆炸的问题,但如果要限制字段长度,则可能仍然有用。通常不需要设置此设置。默认是可以的,除非用户开始添加大量具有真正长名称的字段。
动态mappingedit
在使用之前不需要定义字段和映射类型。由于动态映射,只需索引文档即可自动添加新的字段名称。可以将新字段添加到顶级映射类型,内部对象和嵌套字段。

注:在将数据插入到elasticsearch中时,系统会默认创建mapping规则,常常会出现默认映射字段和实际需求不符的情况。
这时是无法修改已经存在的映射关系的。因为更改映射意味着已经建立索引的文档数据无效。这种情况下应该是用一个正确的映射关系创建新索引,并将数据重新索引到新索引中。 如果你指向重命名字段而不修改映射,可以引入别名字段处理。当重新创建索引覆盖映射关系时,会报错如下:

{
  "error": {
    "root_cause": [
      {
        "type": "resource_already_exists_exception",
        "reason": "index [testbbspost/4XXI8CS9RMSs7u3NVgl1yg] already exists",
        "index_uuid": "4XXI8CS9RMSs7u3NVgl1yg",
        "index": "testbbspost"
      }
    ],
    "type": "resource_already_exists_exception",
    "reason": "index [testbbspost/4XXI8CS9RMSs7u3NVgl1yg] already exists",
    "index_uuid": "4XXI8CS9RMSs7u3NVgl1yg",
    "index": "testbbspost"
  },
  "status": 400
}

在利用grok切割日志数据后,往es库中插入数据,es系统会默认匹配字段类型。如下:

{
  "mapping": {
    "_doc": {
      "properties": {
        "areaId": {
          "type": "long"
        },
        "areaName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "block": {
          "type": "long"
        },
        "collectionNum": {
          "type": "long"
        },
        "commentNum": {
          "type": "long"
        },
        "content": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "ext": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "forumName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "forumid": {
          "type": "long"
        },
        "gmtCreate": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "id": {
          "type": "long"
        },
        "image": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "likeNum": {
          "type": "long"
        },
        "pid": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "pname": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "productId": {
          "type": "long"
        },
        "productTitle": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "productTop": {
          "type": "long"
        },
        "productTopTime": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "shareNum": {
          "type": "long"
        },
        "sort": {
          "type": "long"
        },
        "status": {
          "type": "long"
        },
        "subject": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "tag": {
          "type": "long"
        },
        "type": {
          "type": "long"
        },
        "userHeader": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userId": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userNick": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userRole": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

但是默认将时间类型映射为了text字段。这样的话,首先无法取时间区间进行查询,其次无法利用kibana的可视化工具进行有效的图形制作。我们可以删除当前索引,并重新建立索引并指定映射规则,如下:

PUT testbbspost
{
  "mappings": {
    "_doc": {
      "properties": {
        "areaId": {
          "type": "long"
        },
        "areaName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "block": {
          "type": "long"
        },
        "collectionNum": {
          "type": "long"
        },
        "commentNum": {
          "type": "long"
        },
        "content": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "ext": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "forumName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "forumid": {
          "type": "long"
        },
        "gmtCreate": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "id": {
          "type": "long"
        },
        "image": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "likeNum": {
          "type": "long"
        },
        "pid": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "pname": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "productId": {
          "type": "long"
        },
        "productTitle": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "productTop": {
          "type": "long"
        },
        "shareNum": {
          "type": "long"
        },
        "sort": {
          "type": "long"
        },
        "status": {
          "type": "long"
        },
        "subject": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "tag": {
          "type": "long"
        },
        "type": {
          "type": "long"
        },
        "userHeader": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userId": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userNick": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userRole": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

注:date类型按需格式化以下多种格式
“format”: “yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis”
因为在某些场景下,记录时间的格式没有统一。有‘2019-04-25 12:12:12’或 ‘2019-04-26’或‘1557026719’
多种时间格式。如多个表数据进行整合时会出现。

 

当然我们为了方便,可以在制定索引模板的时候,制定系列索引的字段类型,如下:

PUT /_template/my_index*
{
  "index_patterns": "my_index*",
  "order": 0,
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "_doc": {
      "properties": {
        "title": {
          "type": "text"
        },
        "name": {
          "type": "text"
        },
        "age": {
          "type": "integer"
        },
        "created": {
          "type": "date",
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
} 

这样制定了正确的mapping映射之后,在es的kibana控制台是可以做多维统计图的,效果如下:


   原创文章,转载请标明本文链接: elasticsearch的mapping映射类型和字段限制,通过建立索引模板达到字段映射匹配的要求

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读