Elasticsearch8.1 -- 6. Mapping 中的基本字段类型

字段类型按family分组。同一族中的类型具有完全相同的搜索行为,但可能具有不同的空间使用或性能特征。

目前,除了字符串有两种family类型:keywordtext。 其他类型系列只有一个字段类型, 例如boolean类型族由一种字段类型组成:boolean

常见类型
  • binary
    编码为 Base64 字符串的二进制值。 该字段默认 不存储到索引 且 不可搜索。

    参数 意义
    doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为false
    store 字段值是否应与字段_source分开存储和检索。接受truefalse (默认)。

    参数讲解:

    1. doc_values: 倒排索引这种数据结构并不适合用作聚合,排序,在脚本里访问字段等等这些场景,于是 doc_values 数据结构应运而生。 doc_values 为 true 时,es同时会以列的方式保存一份数据用作聚合,排序。

    binary数据类型使用:

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "blob": {
            "type": "binary",
            "doc_values": false,
            "store": false
          }
        }
      }
    }
    
  • boolean
    true 或者 false

    参数 意义
    doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为false
    index 该字段是否应该可以快速搜索?接受true(默认)和 false. 仅doc_values 启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。
    null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为null,这意味着该字段被视为缺失。请注意,如果使用参数,则 script 无法设置。
    script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。
    on_script_error script中的脚本运行失败时的策略。默认为 fail, 返回doc文档插入失败。
    store 字段值是否应与字段_source分开存储和检索。接受truefalse (默认)。
    meta 关于字段的元数据。
  • Keywords
    Keywords关键字族,包括 keywordconstant_keywordwildcard
    关键字字段通常用于排序, 聚合, 术语级别的查询 ,例如term

    • keyword
      适用于 结构化内容 ,例如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。
      参数 意义
      doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为true
      eager_global_ordinals 是否应该在刷新时急切地加载全局序数?接受true或false (默认)。对于常用于术语聚合的字段建议开启。
      fields 多字段允许为不同目的以多种方式索引相同的字符串值,例如一个用于搜索的字段和一个用于排序和聚合的多字段。
      ignore_above 不要索引任何长于该值的字符串。默认为,2147483647 以便接受所有值。但是请注意,默认动态映射规则会创建一个子keyword字段,通过设置覆盖此默认值ignore_above: 256
      index 该字段是否应该可以快速搜索?接受true(默认)和 false. 仅doc_values 启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。
      index_options 出于评分目的,应将哪些信息存储在索引中。默认为docs但也可以设置为freqs在计算分数时考虑词频。
      meta 关于字段的元数据。
      norms 字段长度是否对查询评分有影响。接受true或false(默认)。
      null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为null,这意味着该字段被视为缺失。请注意,如果使用参数,则 script 无法设置。
      script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。
      on_script_error script中的脚本运行失败时的策略。默认为 fail, 返回doc文档插入失败。
      store 字段值是否应与字段_source分开存储和检索。接受truefalse (默认)。
      similarity 应该使用 哪种评分算法或相似度。默认为BM25.
      normalizer 如何在索引之前对关键字进行预处理。默认为null,表示关键字保持原样。
      split_queries_on_whitespace 为该字段构建查询时,全文查询是否应在空格上拆分输入。接受true或false(默认)。
      参数讲解:
      1. eager_global_ordinals:为了支持字段值的聚合和其他操作,Elasticsearch 使用了一种称为 doc values 的数据结构。在基于字段类型为术语的场景下, 使用 增量整数或序数 替代 相同的术语 可以使 doc values 存储更紧凑。
      2. fields:给字段设置额外的类型和索引方式。例如主类型为text用于全文搜索,同时设置一个keyword用于排序或聚合。
      3. ignore_above :超过ignore_above值所标记的长度,则不会被存储和索引(不影响_source的原始数据)。默认为 2147483647, 基本可接受全部长度。
      4. index:该字段是否应该被快速搜索(被倒排索引存储),接受true(默认)和 false。如果字段 doc_values 存在仍然可以被查询, 只是相对比慢一些(doc_values对应的是正排索引)。

    • constant_keyword
      适用于始终包含相同值的关键字字段, 例如 枚举值。

    • wildcard
      用于非结构化机器生成的内容, 例如日志等一些需要经常正则匹配查询的内容。
  • Numbers
    数字类型,例如 longdouble ,用于表示金额。

    数字类型 参考
    long 一个有符号的 64 位整数,最小值为,最大值为。
    integer 一个有符号的 32 位整数,最小值为,最大值为。
    short 一个有符号的 16 位整数,最小值为 -32768,最大值为 32767 。
    byte 一个有符号的 8 位整数,最小值为-128,最大值为127。
    double 双精度 64 位 IEEE 754 浮点数,限制为有限值。
    float 单精度 32 位 IEEE 754 浮点数,限制为有限值。
    half_float 半精度 16 位 IEEE 754 浮点数,限制为有限值。
    scaled_float 由 long 支持的浮点数,按固定double比例因子缩放。
    unsigned_long 一个无符号的 64 位整数,最小值为 0,最大值为 。
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "number_of_bytes": {
            "type": "integer"
          },
          "time_in_seconds": {
            "type": "float"
          },
          "price": {
            "type": "scaled_float",
            "scaling_factor": 100
          }
        }
      }
    }
    
    参数 意义
    coerce 尝试将字符串转换为数字并截断整数的分数。接受true(默认)和false.
    doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为false
    ignore_malformed 是否忽略错误格式的数字。如果false(默认),格式错误的数字会引发异常并拒绝整个文档。
    index 该字段是否应该可以快速搜索?接受true(默认)和 false. 仅doc_values 启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。
    null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为null,这意味着该字段被视为缺失。请注意,如果使用参数,则 script 无法设置。
    script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。
    on_script_error script中的脚本运行失败时的策略。默认为 fail, 返回doc文档插入失败。
    store 字段值是否应与字段_source分开存储和检索。接受truefalse (默认)。
    meta 关于字段的元数据。
  • Dates
    日期类型,包括datedate_nanos

  • alias
    映射定义索引中字段的alias备用名称。别名可用于代替搜索请求中的目标字段。别名的使用限制:

      1. 目标必须是具体字段,而不是对象或其他字段别名。
      1. 目标字段在创建别名时必须存在。
      1. 如果定义了嵌套对象,则字段别名必须具有与其目标相同的嵌套范围。
      1. 字段别名只能有一个目标

对象和关系类型
  • object
    一个 JSON 对象。
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "region": {
            "type": "keyword"
          },
          "manager": {
            "properties": {
              "age":  { "type": "integer" },
              "name": {
                "properties": {
                  "first": { "type": "text" },
                  "last":  { "type": "text" }
                }
              }
            }
          }
        }
      }
    }
    
    参数 意义
    dynamic 是否允许在插入文档doc时由动态映射为object的properties新增属性。接受true(默认)runtime、false 和strict。
    enabled 为对象字段提供的 JSON 值是否应该被解析和索引(true默认)或完全忽略(false)。
    properties 对象内的字段,可以是任何数据类型,包括object。 可以将新属性添加到现有对象。
  • flattened
    默认情况下, ES会为object中每个子字段进行映射和索引(如果事先不知道子字段的名称和类型, 则动态映射它们)。 这种情况下, 如果这个object类型的对象存在大量的子字段, 会导致子字段映射爆炸。而flattened类型就是为这种情况应运而生的。

    ES会把flattened类型的JSON对象作为单个字段,只把它的 叶子值 作为关键字索引一个字段中。然后可以通过简单的查询和聚合来搜索对象的内容。

    PUT bug_reports
    {
      "mappings": {
        "properties": {
          "title": {
            "type": "text"
          },
          "labels": {
            "type": "flattened"
          }
        }
      }
    }
    
    POST bug_reports/_doc/1
    {
      "title": "Results are not sorted correctly.",
      "labels": {
        "priority": "urgent",
        "release": ["v1.2.5", "v1.3.0"],
        "timestamp": {
          "created": 1541458026,
          "closed": 1541457010
        }
      }
    }
    
    # 这里的查询直接以 ‘labels’ 作为关键字!!!
    POST bug_reports/_search
    {
      "query": {
        "term": {"labels": "urgent"}
      }
    }
    
    参数 意义
    depth_limit 就嵌套内部对象而言,展平对象字段的最大允许深度。如果展平的对象字段超过此限制,则会引发错误。默认为20
    doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?接受true (默认)或false.
    eager_global_ordinals 是否应该在刷新时急切地加载全局序数?接受true或false (默认)。对于常用于术语聚合的字段建议开启。
    ignore_above 超过此限制的叶值将不会被索引。默认情况下,没有限制,所有值都将被索引。请注意,此限制适用于展平对象字段中的叶值,而不是整个字段的长度。
    index 确定该字段是否应该是可搜索的。接受true(默认)或 false.
    index_options 出于评分目的,应将哪些信息存储在索引中。默认为docs但也可以设置为freqs在计算分数时考虑词频。
    null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为null,这意味着该字段被视为缺失。请注意,如果使用参数,则 script 无法设置。
    similarity 应该使用 哪种评分算法或相似度。默认为BM25.
    split_queries_on_whitespace 为该字段构建查询时,全文查询是否应在空格上拆分输入。接受true或false(默认)。
  • nested
    nested类型是object数据类型的特殊版本,它允许对对象数组进行索引,从而可以相互独立地查询它们。

    默认情况下, object数据类型对于数组的映射和索引使用的是扁平化展开的方式。

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

    实际上,上面文档将在内部转换为看起来更像这样的文档:

    {
      "group" :        "fans",
      "user.first" : [ "alice", "john" ],
      "user.last" :  [ "smith", "white" ]
    }
    

    为了让object类型字段内的数组对象之间保持独立性,nested便应运而生了!!!

    参数 意义
    dynamic 是否允许在插入文档doc时由动态映射为object的properties新增属性。接受true(默认)runtime、false 和strict。
    properties 对象内的字段,可以是任何数据类型,包括object。 可以将新属性添加到现有对象。
  • join
    为同一索引中的文档定义父/子关系。

    • mapping定义,relations:{ "parent-field" : "child-field"}
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "my_id": {
            "type": "keyword"
          },
          "my_join_field": {
            "type": "join",
            "relations": {
              "question": "answer"
            }
          }
        }
      }
    }
    
    • 插入parent-doc的两种方式
    PUT my-index-000001/_doc/1?refresh
    {
      "my_id": "1",
      "text": "This is a question",
      "my_join_field": {
        "name": "question"
      }
    }
    
    PUT my-index-000001/_doc/1?refresh
    {
      "my_id": "1",
      "text": "This is a question",
      "my_join_field": "question"
    }
    
    • 插入child-doc
    PUT my-index-000001/_doc/3?routing=1&refresh 
    {
      "my_id": "3",
      "text": "This is an answer",
      "my_join_field": {
        "name": "answer",
        "parent": "1" 
      }
    }
    
    1.  `?routing=parent-doc-id`路由值是强制性的,因为父文档和子文档必须在同一个分片上建立索引。
    2.  `"answer"`为 `parent/child` 关系中的`child`, 因此必须添加`"parent"`字段, 且填充`parent/child` 关系中的`parent-id`。
    3.  在`插入parent-doc`的例子里面, 没有添加`"parent"`字段。因为`"question"`是`parent/child` 关系中的`parent`,插入`parent-doc`时, ES会默认填充`_id`到`"parent"`字段中。
    
    • join 使用限制

      1. 一个索引最多只能有一个join 类型字段
      2. parent-docchild-doc 必须在同一个shard分片中
      3. 一个元素可以有多个子元素,但只有一个父元素。
      4. 可以向现有join字段添加新关系。
      5. 也可以将子元素添加到现有元素,但前提是该元素已经是父元素。
    • 使用 join 搜索

      1. join 会创建一个字段来索引文档中的关系名称, 例如question, answer
      2. 它还为每个parent/child关系创建一个字段, 例如"my_join_field#question" , 如果该文档为parent-doc:question则为自身_id, 如果该文档为child-doc:answer_id为链接到父文档。
      GET my-index-000001/_search
      {
        "query": {
          "parent_id": { 
            "type": "answer",
            "id": "1"
          }
        },
        "aggs": {
          "parents": {
            "terms": {
              "field": "my_join_field#question", 
              "size": 10
            }
          }
        },
        "runtime_mappings": {
          "parent": {
            "type": "long",
            "script": """
              emit(Integer.parseInt(doc['my_join_field#question'].value)) 
            """
          }
        },
        "fields": [
          { "field": "parent" }
        ]
      }
      

你可能感兴趣的:(Elasticsearch8.1 -- 6. Mapping 中的基本字段类型)