淘先锋技术网

首页 1 2 3 4 5 6 7

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 datatypeElasticsearch datatype
nullNo field is added.
true or falseboolean field
floating point numberfloat field
integerlong field
objectobject field
arrayDepends on the first non-null value in the array.
stringEither 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"
        }
      }
    }
  }
}