Elasticsearch之Mapping

发布时间 2023-09-06 15:59:03作者: emptyironbox

Mapping的作用

Mapping 类似数据库中的表结构定义 schema ,它有以下几个作用:

  • 定义索引中的字段名称
  • 定义字段的数据类型,如字符串、数字、布尔等
  • 字段,倒排索引的相关配置,如设置某个字段不被索引、记录 position等

字段数据类型

核心类型

字符串类型:
  	text:适合需要被全文检索的字段,会被分词器处理,不能用于排序
  	keyword:适合简短、结构化字符串、可以用于过滤、排序、精确查询和聚合检索
数字类型:
  	long 
    integer
    short
    byte
    double
    float
    half_float
    scaled_float
日期类型:ES底层采用时间戳的形式存储
		date
    daate_nanos
布尔类型:
    boolean
二进制类型: 默认 store 属性为false,不可以被搜索
		binary
范围类型:
      integer_range
      float_range
      long_range
      dobule_range
      date_range

复杂类型

对象类型:object
嵌套类型:nested  

地理类型

经纬度类型:geo_point
地理区域类型:geo_shape

特殊类型

ip类型:ip
join类型:join  主要用于做父子查询

多字段类型

有时候一个字段同时拥有全文类型(text)和关键字类型(keyword)时:一个用于全文搜索,另一个用于聚合和排序。可以通过多字段类型来实现。

例如城市名称:

PUT citys
{
  "mappings": {
    "properties": {
      "cityName": {
        "type": "text",
        // 多字段设置
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

映射类型

在 Elasticsearch中可以不需要事先定义映射(Mapping),文档写入Elasticsearch时,会根据文档字段自动识别类型,但是通过这种自动识别的字段不是很精确,对于一些复杂的需要分词的就不适合了。

根据是否自动识别映射类型,我们可以将映射分为动态映射静态映射

动态映射,即不事先指定映射类型(Mapping),文档写入Elasticsearch时,ES会根据文档字段自动识别类型,这种机制称之为动态映射。

静态映射,即人为事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射,亦可称为显式映射。

动态映射

默认情况下,当在文档中找不到字段的定义时,Elasticsearch会自动将这个新字段添加到类型映射中。我们可以在文档和object级别禁用这项功能,具体操作方式就是通过将 dynamic参数设置为falsestrict,设为false是忽略新字段,而设为strict是如果遇到未知字段,就抛出异常。

PUT {索引名}{
  "mappings":{
    "_doc":{
      	"dynamic":false
    }
  }
}
True False Strict
文档可索引
字段可索引
Mapping 被更新

静态映射

像之前创建的 citys 就属于静态映射。

修改已存在字段类型

ES 是不允许修改字段的类型的,因为 ES 是根据 Lucene 实现的倒排索引,一旦生成后就不允许修改,如果希望改变字段类型,必须使用 Reindex API 重建索引。

不能修改的原因是如果修改了字段的数据类型,会导致已被索引的无法被搜索,但是如果是增加新的字段,就不会有这样的影响。