(八)ElasticSearch之文档映射

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/IT_hejinrong/article/details/89494389

一. 文档映射的原理

咱们之前已经把ElasticSearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。
文档映射就是给文档中的字段指定字段类型、分词器。
使用 GET /hszsd/user/_mapping

二. 映射的分类

2.1 动态映射

我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射

2.2 静态映射

在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射

三. ES类型支持

3.1 基本类型

字符串:string,string类型包含 text 和 keyword。

text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。
keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚合,keyword类型自读那只能用本身来进行检索(不可用text分词后的模糊检索)。
注意: keyword类型不能分词,Text类型可以分词查询
数指型:long、integer、short、byte、double、float
日期型:date
布尔型
:boolean
二进制型:binary
数组类型:(Array datatype)

3.2 复杂类型

3.2.1 地理位置类型(Geo datatypes)

地理坐标类型(Geo-point datatype):geo_point 用于经纬度坐标
地理形状类型(Geo-Shape datatype):geo_shape 用于类似于多边形的复杂形状

3.2.2 特定类型(Specialised datatypes)

Pv4 类型(IPv4 datatype):ip 用于IPv4 地址
Completion 类型(Completion datatype):completion 提供自动补全建议
Token count 类型(Token count datatype):token_count 用于统计做子标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
mapper-murmur3 类型:通过插件,可以通过_murmur3_来计算index的哈希值
附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
在这里插入图片描述
Analyzer 索引分词器,索引创建的时候使用的分词器 比如ik_smart
Search_analyzer 搜索字段的值时,指定的分词器

3.2.3 创建文档类型并且指定类型

我们使用postman来创建指定文档类型,首先我们要创建一个索引如下:

PUT /userinfo

然后在postman中输入:http://101.37.146.240:9200/userinfo/user/_mapping
选择“body”->“raw”->“JSON”,复制以下内容:

{
  "user":{
    "properties":{
       "age":{
         "type":"integer"
       },
        "sex":{
         "type":"integer"
       },
       "name":{
         "type":"text",
         "analyzer":"ik_smart",
         "search_analyzer":"ik_smart"
       },
       "car":{
         "type":"keyword"
       }
    }
  }
}

注意,一定要是POST请求哈!
截图如下:
在这里插入图片描述

四. 指定文档类型演示

上面我们已经看到,如果你设置文档的字段类型为Keyword,那表示它不再支持分词,设置为text才支持分词,这有什么意义呢?上面已经创建好了一个索引:userinfo,并且我们设置了字段名称为car的类型为keyword,接下来表演开始:

4.1 新增三条索引数据

PUT /userinfo/user/100
{
          "name": "何金荣",
          "age": 28,
          "sex": 0,
          "car": "共享汽车"
}

PUT /userinfo/user/101
{
          "name": "黄功利",
          "age": 30,
          "sex": 0,
          "car": "大众朗逸"
}

PUT /userinfo/user/102?version=1
{
          "name": "罗茂豪",
          "age": 30,
          "sex": 0,
          "car": "大众零度"
}

通过查询类型为user的数据有三条:
在这里插入图片描述

4.2 按字段car来精准查询

GET /userinfo/user/_search
{
  "query": {
    "term": {
      "car": "共享" //这个应该都明白是查询不到的
    }
  }
}
GET /userinfo/user/_search
{
  "query": {
    "term": {
      "car": "共享汽车" //可以查询到
    }
  }
}

4.3 按字段car来模糊查询

GET /userinfo/user/_search
{
  "query": {
    "match": {
      "car": "共享" //这样是查询不到的,因为设置的类型为:Keyword
    }
  }
}
GET /userinfo/user/_search
{
  "query": {
    "match": {
      "car": "共享汽车" //如此就可以,相当于car字段不会分词查询,只会整体查询
    }
  }
}

4.4 结论

如果这是文档的字段类型为keyword,则不会进行分词查询,text可以。

猜你喜欢

转载自blog.csdn.net/IT_hejinrong/article/details/89494389