ElasticSearch Mapping

elasticSearch Mapping

在es中也有存储结构的定义,就像在传统的数据库中的表结果的定义

在elasticsearch7.X之后移除的type的概念
在官方的解释中,因为es底层用的Lucene,之前我们都将type类比于关系型数据库中的表,但是不同的是,关系型数据库中的表之间是独立的,每个表中即使有相同的字段也不会影响最终的查询结果,并且没有二义性。不同于传统数据库的是elasticsearch中type中的每个字段并没有相互隔离,如果不同type中有很多相同的字段,对于最终的Lucene压缩和不同类型之间的修改或者删除有很大的影响。

es中数据类型

Core datatypesedit

  1. string
    text and keyword
  2. Numeric datatypes
    long, integer, short, byte, double, float, half_float, scaled_float
  3. Date datatype
    date
  4. date_nanos datatype
    date_nanos
  5. Boolean datatype
    boolean
  6. Binary datatype
    binary
  7. Range datatypes
    integer_range, float_range, long_range, double_range, date_range
  8. Range datatypes
    Complex datatypesedit
    Array datatype
    Array support does not require a dedicated type
    Object datatype
    object for single JSON objects
    Nested datatype
    nested for arrays of JSON objects
  9. Geo datatypes
    Geo datatypesedit
    Geo-point datatype
    geo_point for lat/lon points
    Geo-Shape datatype
    geo_shape for complex shapes like polygons

es 元数据

  1. _index :代表了这个文档属于哪个索引
  2. _type : 文档的类型
  3. _id:文档的Id

Document source meta-fields

  1. _source : 代表原始的JSON文档类型
  2. _size:_source的byte大小
  3. _field_names:文档中所有字段名称
  4. _ignored:被忽略的字段

setting 中的一些组件:

  1. coerce:数据的严格性,比如,定义一个字段类型为integer,但是放入“5.0”也不会报错,但是总会需要严格的数据,如果在字段中加入coerce:false 则需要强类型的限制,如果规定字段类型为Integer,传入字符串类型的数字则会报错
  2. dynamic
    1. true:新增的字段会加入mapping中,默认设置
    2. false:新检测到的字段将被忽略。这些字段不会被编入索引,因此无法搜索,但仍会出现在_source返回的匹配字段中。这些字段不会添加到映射中,必须显式添加新字段
    3. strict:如果检测到新字段,则抛出异常并拒绝该文档。必须将新字段显式添加到映射中。
  3. copy_to
    将多个字段聚合到一个字段中方便查询,他是复制字段中的值,不是item
  4. null_value
    一个null值不能被索引或搜索。当字段设置为null(或空数组或null值数组)时,它被视为该字段没有值。

动态属性Mapping

在默认情况下,我们新建文档的时候,es会通过探测类型自动建立Mapping,支持一下类型的建立:

JSON datatype Elasticsearch datatype
null No field is added.
true or false boolean field
floating point number float field
integer long field
object object field
array Depends on the first non-null value in the array.
string Either a date field (if the value passes date detection), a double or longfield (if the value passes numeric detection) or a text field, with a keywordsub-field.

日期类型的探测:

默认的日期格式为:[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
比如:

PUT my_index/_doc/1
{
  "create_date": "2015/09/02"
}

对应的mapping为:可见时间被格式化为默认时间类型

{
  "my_index" : {
    "mappings" : {
      "properties" : {
        "create_date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
        }
      }
    }
  }
}

如果不想不自动检测类型,则可以配置:

PUT my_index
{
  "mappings": {
    "date_detection": false
  }
}

自定义时间侦测类型

PUT my_index
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}

我们在创建文档的时候,遇到这种类型的字符串才会被格式化成时间

数字类型侦探:

PUT my_index
{
  "mappings": {
    "numeric_detection": true
  }
}

开启之后,会将文档中的字符串转为响应的数字类型

index

index开启之后则将记录索引,否则不记录,即不可搜索

dynamic Template

可以定义将特定的类型转为另一个类型,或者匹配某一个或者某一类关系

自定义mapping建议

  1. 将目标文档写入es中,获取es自动生成的mapping
  2. 修改步骤1中获得的mapping,并自定义相关配置
  3. 使用步骤2中的mapping创建实际所需要的索引

索引模板:

在es中我们可能会对某个索引进行按时间切分,来达到更好的效率,这时候我们可以定义索引模板
新建索引模板:

PUT _template/template_1
{
  "index_patterns": ["te*", "bar*"],//索引模板匹配规则
  "order":0,//匹配顺序,如果有几个命中,则order越大,选择哪个
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "_source": {
      "enabled": true
    },
    "properties": {
      "host_name": {
        "type": "keyword"
      },
      "created_at": {
        "type": "date",
        "format": ["MM/dd/yyyy"]
      }
    }
  }
}

新建文档:

PUT test_2/_doc/1
{
  "created_at":"01/22/2019",
  "host_name":"localhost"
}

则会命中索引模板中的设置
查看mapping设置:GET test_2/_mapping

{
  "test_2" : {
    "mappings" : {
      "properties" : {
        "created_at" : {
          "type" : "date",
          "format" : "[MM/dd/yyyy]"
        },
        "host_name" : {
          "type" : "keyword"
        }
      }
    }
  }
}

你可能感兴趣的:(ElasticSearch)