Elasticsearch初识之Mapping详解附加代码示例

概念

ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。

查看mapping

GET /index/_mappings

ES数据类型

常见类型
数字类型:
  1. long

  2. integer

  3. short

  4. byte

  5. double

  6. float

  7. half_float

  8. scaled_float

  9. unsigned_long

Keyword:
  1. keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword,keyword不会被分词,如果数字类型不用于范围查找,用keyword的性能要高于数值类型

  2. constant_keyword:始终包含相同值的关键字字段

  3. wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值

  4. 关键字字段通常用于排序, 汇总和Term查询,例如term。

  5. 当使用keyword类型查询是,其字段值会被作为一个整体,并保留字段值的原始属性

    注意事项:

    keyword不会对文本分子,会保留字段属性包括大小写等

    keyword仅仅是字段类型,不会对搜索词产生任何影响

    keyword一般需要精确查找的字段,或者聚合排序字段

    keyword通常和term搜索一起使用

    keyword字段的igonre_above参数代表其阶段长度,默认256,如果超出长度,字段值会被忽略,而不是截断(仅不添加任何条件可查到结果--》---->_search)

Dates(时间类型):

包括date和 date_nanos

alias:

为现有字段定义别名。

[binary](二进制):
binary
range(区间类型):
  1. integer_range

  2. float_range

  3. long_range

  4. double_range

  5. date_range

text:

当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为text创建正排索引:大量堆空间,尤其是在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因)

注意事项:

适用于全文检索,如match查询

文本字段会被分词

默认情况下会创建倒排索引

自动映射器会为text类型创建keyword字段

对象关系类型:
  1. object:用于单个JSON对象

  2. nested:用于JSON对象数组

  3. flattened:允许将整个JSON对象索引为单个字段。

结构化类型:
  1. geo-point:纬度/经度积分

  1. geo-shape:用于多边形等复杂形状

  1. point:笛卡尔坐标点

  1. shape:笛卡尔任意几何图形

特殊类型:
  1. IP地址:ip 用于IPv4和IPv6地

  1. completion:提供自动完成建议

  1. tocken_count:计算字符串中令牌的数量

  1. murmur3:在索引时计算值的哈希并将其存储在索引中

  1. annotated-text:索引包含特殊标记的文本(通常用于标识命名实体)

  1. percolator:接受来自query-dsl的查询

  1. join:为同一索引内的文档定义父/子关系

  1. rank features:记录数字功能以提高查询时的点击率。

  1. dense vector:记录浮点值的密集向量。

  1. sparse vector:记录浮点值的稀疏向量。

  1. search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成

  1. histogram:histogram 用于百分位数聚合的预聚合数值。

  1. constant keyword:keyword当所有文档都具有相同值时的情况的 专业化。

array(数组):

在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的数据类型。

新增:
  1. date_nanos:date plus 纳秒

  1. features:

两种映射类型

自动映射Dynamic field mapping:
  1. 整数 => long

  2. 浮点数 => float

  3. true || false => boolean

  4. 日期 => date

  5. 数组 => 取决于数组中的第一个有效值

  6. 对象 => object

  7. 字符串 => 如果不是数字和日期类型,那会被映射为text和keyword两个类型

除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为其他类型ES无法自动识别。

手动映射 Expllcit field mapping:
PUT /product
{
  "mappings": {
    "properties": {
      "field": {
        "mapping_parameter": "parameter_value"
      }
    }
  }
}

映射参数

  1. index:是否对创建对当前字段创建倒排索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示

  2. analyzer:指定分析器(character filter、tokenizer、Token filters)。

  3. boost:对当前字段相关度的评分权重,默认1

  4. coerce:是否允许强制类型转换 true “1”=> 1 false “1”=< 1

  5. copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询

  6. doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)

  7. dynamic:控制是否可以动态添加新字段

    true 新检测到的字段将添加到映射中。(默认)

    false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式 添加新字段。

    strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中

  8. eager_global_ordinals:用于聚合的字段上,优化聚合性能。

    Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据, Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能 是秒级或者分钟级。eager_global_ordinals不适用于Frozen indices

  9. enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。

    PUT my_index
    {
      "mappings": {
        "enabled": false
      }
    }
  1. fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中

  1. fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)

  1. format:格式化

  "date": {
     "type":  "date",
     "format": "yyyy-MM-dd"
   }
  1. ignore_above:超过长度将被忽略

  1. ignore_malformed:忽略类型错误

  1. index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段

  1. Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间

  1. Index_prefixes:前缀搜索

min_chars:前缀最小长度,>0,默认2(包含)

max_chars:前缀最大长度,<20,默认5(包含)

  1. meta:附加元数据

  1. normalizer:

  1. norms:是否禁用评分(在filter和聚合字段上应该禁用)。

  1. null_value:为null值设置默认值

  1. position_increment_gap:

  1. proterties:除了mapping还可用于object的属性设置

  1. search_analyzer:设置单独的查询时分析器:

  1. similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean

  1. store:设置字段是否仅查询

  1. term_vector:运维参数

自动映射模版

应用场景:

映射的字段类型或者字段参数,都是为确定的某个字段而声明的,如果希望对符合特定要求的特定字段制定映射就需要用到映射模版:Dynamic templates

用法
基本语法
"dynamic_templates": [
  {
    "my_template_name": {
      ... match conditions ...  ----命中条件
      "mapping": {
        .....
      }
    }
  }
]
Conditions参数

match_mapping_type:用来匹配当前映射的字段类型。可以理解为,当字段类型为match_mapping_type时

match和umatch:用来匹配当前映射字段的名称。可以理解为,当字段名称匹配match、match_pattern时,当字段名称不匹配unmatch

path_match和path_unmatch:用来匹配当前映射字段的路径,通常用来匹配嵌套字段。可以理解为,当字段路径为path_match时,当字段路径不匹配path_unmatch

{name}和{dynamic_type} :用来进行占位符匹配,具体怎么用,都可以,但是最终映射的值为name或动态类型 当然也可以直接强制指定类型和属性

官方文档地址:Dynamic templates | Elasticsearch Guide [8.11] | Elastic

示例代码
PUT test_dynamic_mapping
{
  "mappings": {
    "dynamic_templates": [
      {
        #所有long类型映射为integer类型
        "integers":{
          "match_mapping_type":"long", 
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        #String类型 字段名以num_开头 且不以_text结尾则声明为keyword类型
        "longs_as_strings":{
          "match_mapping_type":"string",
          "match":"num_*",
          "unmatch":"*_text",
          "mapping":{
            "type":"keyword"
          }
        }
      }
      ]
  }
}

你可能感兴趣的:(Elasticsearch,elasticsearch,大数据)