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 位整数,最小值为-2^{63},最大值为2^{63} -1
    integer 一个有符号的 32 位整数,最小值为-2^{31},最大值为2^{31} -1
    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,最大值为 2^{64} -1
    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" }
        ]
      }
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容