Elasticsearch的Mapping

发布于:2024-07-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

Elasticsearch的Mapping

Mapping是什么

  1. Mapping定义了ES的索引结构、字段类型、分词器等,是索引的一部分。
  2. 类似于关系型数据库中“表结构”的概念,在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性

查看索引Mapping

  1. 查看索引完整mapping: get /my_index/_mappings
  2. 查看索引指定字段的mapping: get /my_index/_mappings/field/xxx

字段数据类型(常用)

  1. 数字类型:long、integer、short、byte、double、float
  2. 基本数据类型:boolean、alias
  3. keywords类型:
  4. keyword:用于索引结构化字段,可用于过滤、排序、聚合,keyword类型只能通过精确值搜索到,比如ID、姓名等
  5. wildcrd:可以针对类似grep的,用于模糊查询
  6. 时间类型:date、data_nanos
  7. 对象类型:
  8. object:非基本类型之外,默认的json对象为Object
  9. flattened:单映射对象类型、其值为json对象
  10. nested:嵌套类型
  11. join:父子关系类型
  12. 空间数据类型:
  13. geo_point:空间中的点,比如经纬度
  14. geo_shape:复杂型状,比如多边形
  15. 文本搜索类型:
  16. text:文本类型,适用于全文检索
  17. completion:用于自动补全,即搜索推荐

映射类型(两种)

自动映射-Dynamic Field Mapping(不推荐使用)

es在增加数据的时候如果没有指定字段的类型,es会自动分配类型

  1. 如果是true或false默认boolean
  2. 如果是小数默认float
  3. 如果是数字默认long
  4. 如果是object默认object
  5. 如果数组取决于数组中第一个非空元素类型
  6. 如果是日期格式字符串默认date
  7. 如果是数字类型字符串默认float或long
  8. 如果其它字符串默认text+keyword
显示映射-Expllcit Field Mapping

在创建Mapping时候,手动创建类型

例子:

PUT my_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

映射参数

映射参数就是在创建索引时候的mapping中可以配置什么参数,分别代表什么含义

  1. index:表示对当前自动创建倒排索引,默认true,如果不创建索引,则不可以通过当前字段作为搜索条件
  2. analyzer:指定分词器,只可以对可以分词的字段类型使用
  3. boots:对当前字段相关度评分权重,默认1
  4. coerce:是否允许强制类型转换
  5. copy_to:用于将其它字段拼接后存储到当前字段中
  6. doc_value:默认为true,可以提高排序和聚合的效率
  7. dynamic:控制是否可以动态添加新的字段
  8. strict:如果检测到新字段,会引发异常并拒绝文档,必须将新字段显示的添加到mapping中
  9. eager_global_ordinals:用于聚合字段,提示聚合性能,
  10. enabled:是否创建倒排索引,可以作用于mapping也可以作用于field上
  11. fielddata:查询时内存数据结构,在内存中存储,设置字段为filedata会给该字段创建倒排索引并放到内存中。
  12. field:当前字段的子字段
  13. format:定义日期格式
  14. ignore_above:超过长度的内容被忽略,不被存储
  15. ignore_malformed:忽略类型错误
  16. index_phrases:提升exact_value查询速度
  17. index_prefixes:前缀检索,有两个属性
  18. min_chars:前缀最小长度,默认2
  19. max_chars:前缀最大长度,默认5最大20
  20. meta:添加元数据
  21. norms:是否禁用评分
  22. null_value:为空值赋值默认值
  23. properties:在mapping中可以配置字段的属性
  24. search_analyzer:设置单独的查询分析器,默认和analyzer一致,如果两者都没设置默认为”standard"。analyzer针对元数据,search_analyzer针对搜索的内容。
  25. similarity:为字段设置相关度算法
  26. store:设置字段是否创建索引
  27. term_vector:运维参数

映射模板

映射模板用来解决不确定的类型或字段名索引的创建,可以理解为批量处理索引的mapping

例子:给user索引创建两个模板,第一个模板将long类型的属性默认转换为integer类型,第二个模板将以sum_开头的字段且不以_text结尾的字段且为String类型的字段转换为keyword类型

put user3
{
  "mappings":{
    "dynamic_templates":[
      {
        "long-to-integer":{
          "match_mapping_type": "long",
          "mapping":{
            "type": "integer"
          }
        }
      },
      {
        "num_and_string":{
          "match_mapping_type":"string",
          "match":"num_*",
          "unmatch":"*_text",
          "mapping":{
            "type":"keyword"
          }
        }
      }
    ]
  }
}

查看索引

{
  "user3": {
    "mappings": {
      "dynamic_templates": [
        {
          "long-to-integer": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "integer"
            }
          }
        },
        {
          "num_and_string": {
            "match": "num_*",
            "unmatch": "*_text",
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ],
      "properties": {
        "age": {
          "type": "integer"
        },
        "firends": {
          "properties": {
            "age": {
              "type": "integer"
            },
            "num_test1": {
              "type": "keyword"
            }
          }
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "num_test2": {
          "type": "keyword"
        },
        "num_test2_text": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}