• ElasticSearch-Mapping详解


    概述

    概念

    映射时定义文档及其包含的字段的存储和索引方式的过程。
    ES的mapping有点类似于RDB中表结构的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器,是否评分、是否创建索引等属性,并且在ES中一个字段可以对应多个类型、分词器,评分等。

    查看mapping

    GET /index/_mapping

    Mapping数据类型

    常见类型

    1. 数字类型
      long integer short byte double float half_float scaled_float unsigned_long
    2. keywords
      keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword。
      constant_keyword:始终包含相同值的关键字字段。
      wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值
      关键字字段通常用于排序,汇总和Term查询。
    3. Dates(时间类型):包括date和date_nanos
    4. alias:为现有字段定义别名。
    5. binary(二进制):binary
    6. range(区间类型):integer_range、float_range、long_range、double_range、date_range
    7. text:当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用与排序,很少用于聚合。(解释一些为什么不会为text创建正排索引:大量堆空间,尤其是在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的声明周期内保持在哪里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因)。
      text默认会创建倒排索引,但是不会创建正排索引,倒排索引主要用于全文检索,正排索引主要用于排序、聚合等。

    对象关系类型

    1. object:用于单个JSON对象
    2. nested:嵌套类型,用于JSON对象数组
    3. flattened:平整的,允许将整个JSON对象索引为单个字段。

    结构化类型

    1. geo-point:纬度/经度积分
    2. geo-shape:用于多边形等复杂形状
    3. point:笛卡尔坐标点
    4. shape:笛卡尔任意几何图形

    特殊类型

    1. IP地址:ip 用于IPv4和IPv6地址
    2. completion:提供自动完成建议
    3. tocken_count:计算字符串中令牌的数量
    4. murmur3:在索引时计算值的哈希并将其存储在索引中
    5. annotated-text:索引包含特殊标记的文本(通常用于标识命名实体)
    6. percolator:接受来自query-dsl的查询
    7. join:为同一索引内的文档定义父/子关系
    8. rank features:记录数字功能以提高查询时的点击率。
    9. dense vector:记录浮点值的密集向量。
    10. sparse vector:记录浮点值的稀疏向量。
    11. search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成
    12. histogram:histogram 用于百分位数聚合的预聚合数值。
    13. constant keyword:keyword当所有文档都具有相同值时的情况的 专业化。

    array(数组)

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

    两种映射方式

    dynamic mapping(动态索引或自动映射)

    dynamic field mapping

    • 整数 => long
    • 浮点数 => float
    • true || false => boolean
    • 日期 => date
    • 数组 => 取决于数组中的第一个有效值
    • 对象 => object
    • 字符串 => 如果不是数字和日期类型,那么被映射为text何keyword两个类型。
      除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为请求类型ES无法自动识别。

    explicit mapping(静态索引或手工映射或显示映射)

    语法如下:

    PUT /product
    {
      "mappings": {
        "properties": {
          "field": {
            "mapping_parameter": "parameter_value"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    示例如下

    # 创建一个索引,并且指定索引类型
    PUT /my_test
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "text"
          }
        }
      }
    }
    # 索引已经存在,在原有的索引上增加一个字段与类型
    PUT /my_test/_mapping
    {
      "properties": {
        "count": {
          "type": "long"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    注意:手工创建mapping时,字段的mapping只能创建,无法修改。

    Mapping参数

    • type:字段类型,如上示例所示
    • index:是否对当前字段创建倒排索引,默认true,如果不创建倒排索引,该字段不会通过索引被搜索到,但是仍然会在source源数据中展示。
    • analyzer:指定分线器(character filter、tokenizer、token filters)。
    • boost:对当前字段相关度的评分权重,默认1。
    • coerce:是否允许强制类型转换true “1” => 1 false “1” =< 1
    • copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询。
    • doc_values:建立正排索引,为了提升排序和聚合效率,默认true(text/annotated_text除外),如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)。
    • dynamic:控制是否可以动态添加新字段
      1. true 新检测到的字段将添加到映射中(默认)。
      2. false 新检查到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显示添加新字段。
      3. strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显示添加到映射中。
    • eager_global_ordinals:用于聚合的字段上,优化聚合性能。
      1. frozen indices(冻结索引): 有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据, Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能 是秒级或者分钟级。eager_global_ordinals不适用于Frozen indices
    • enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,仍然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。
        PUT my_index
        {
          "mappings": {
            "enabled": false
          }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中。
    • fields:给当前字段创建多字段,用于不同目的(全文检索或者聚合分析排序)。
    • format:格式化
      "date": {
         "type":  "date",
         "format": "yyyy-MM-dd"
       }
    
    • 1
    • 2
    • 3
    • 4
    • ignore_above:超过长度的将被忽略
    • ignore_malformed:忽略类型错误
    • index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段
    • Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间
    • Index_prefixes:前缀搜索
    • min_chars:前缀最小长度,>0,默认2(包含)
    • max_chars:前缀最大长度,<20,默认5(包含)
    • meta:附加元数据
    • normalizer:平衡器
    • norms:是否禁用评分(在filter和聚合字段上应该禁用)。
    • null_value:为null值设置默认值
    • position_increment_gap:
    • proterties:除了mapping还可用于object的属性设置
    • search_analyzer:设置单独的查询时分析器:
    • similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean
    • store:设置字段是否仅查询
    • term_vector:运维参数
  • 相关阅读:
    FFMpeg zoompan 镜头聚焦和移动走位
    操作系统 进程同步及线程满分作业
    Html 标题标签h1-h6详解和细节分析
    供热管网优化设计的数学模型
    python编程:使用 Pillow 将照片转换为1寸报名照片
    红细胞膜包裹铜纳米颗粒/红细胞膜修饰普鲁兰纳米粒子/载磁性碳/黑磷量子点细胞膜制备
    1130 - Host ‘192.168.10.10‘ is not allowed to connect to this MysOL server
    【YOLO格式的数据标签,目标检测】
    高等数学基础概念的Python开发实现
    Python是最受欢迎的语言?名不副实
  • 原文地址:https://blog.csdn.net/tianzhonghaoqing/article/details/127934888