ElasticSearch之-映射管理

es中的类型---->对应mysql中的表,也叫映射管理

在Elasticsearch 6.0.0或更高版本中创建的索引只包含一个mapping type。 在5.x中使用multiple mapping types创建的索引将继续像以前一样在Elasticsearch 6.x中运行(只能读,不能存)。 Mapping types将在Elasticsearch 7.0.0中完全删除(读都不能读了,从旧版导入都不行了)


 

1 映射介绍

在创建索引的时候,可以预先定义字段的类型及相关属性

Es会根据Json数据源的基础类型,猜测你想要映射的字段,将输入的数据转变成可以搜索的索引项。

Mapping是我们自己定义的字段数据类型,同时告诉es如何索引数据及是否可以被搜索。

作用:会让索引建立的更加细致和完善

1.1 字段数据类型

string类型:text,keyword

数字类型:long(int64),integer(int32),short(int16),byte(int8),double,float    这些都是java的基础数据类型

日期类型:data

布尔类型:boolean

binary类型:binary 二进制类型,可以直接把文件以二进制的格式放进去,mysql也有二进制类型,一般不用

复杂类型:object(实体,对象,可以是字典也可以是列表),nested(列表)

geo类型:geo-point,geo-shape(地理位置)

专业类型:ip,competion(搜索建议)


1.2 映射参数

属性 描述 适合类型
store 值为yes表示存储,no表示不存储,默认为no all
index yes表示分析(分词),no表示不分析,默认为true text
null_value 如果字段为空,可以设置一个默认值,比如"NA"(传过来为空,不能搜索,na可以搜索) all
analyzer 可以设置索引和搜索时用的分析器,默认使用的是standard分析器,还可以使用whitespace,simple。都是英文分析器 all
include_in_all 默认es为每个文档定义一个特殊域_all,它的作用是让每个字段都被搜索到,如果想让某个字段不被搜索到,可以设置为false all
format 时间格式字符串模式 date

 

2 创建索引

text类型会取出词做倒排索引, keyword不会被分词,原样存储,原样匹配

mapping类型一旦确定,以后就不能修改了

es 6.x版本及以前版本

PUT books
{
  "mappings": {
    "book":{  #表示类型(表名),6.x以前可以建多个表
      "properties":{
        "title":{
          "type":"text",
         	"analyzer": "ik_max_word"
        },
        "price":{
          "type":"integer"
        },
        "addr":{
          "type":"keyword"
        },
        "company":{
          "properties":{
            "name":{"type":"text"},
            "company_addr":{"type":"text"},
            "employee_count":{"type":"integer"}
          }
        },
        "publish_date":{"type":"date","format":"yyy-MM-dd"}      
      }
    }
  }
}

es 7.x版本以后

PUT books  #创建索引和映射,创建后不会看到表的结构,新增文档后才能看到
{
  "mappings": { #创建映射(创建表) 是一个复杂类型,字典/字典中再嵌套字典
    "properties":{ #包在properties字典中
      "title":{    #字段名
        "type":"text",  #字段属性,text类型
        "analyzer": "ik_max_word"  #字段属性,用ik_max_word做分词
      },
      "price":{  #字段名
        "type":"integer"
      },
      "addr":{  #字段名
        "type":"keyword"  #keyword类型不做分词,直接建索引
      },
      "company":{ #字段名
        "properties":{  #包在properties字典中
          "name":{"type":"text"},
          "company_addr":{"type":"text"},
          "employee_count":{"type":"integer"}
        }
      },
      "publish_date":{"type":"date","format":"yyy-MM-dd"} #日期类型有format属性,表示日期格式
      
    }  
  }
}

插入数据测试:属于文档操作

# 朝books索引中的表插入数据,由于没有写映射名(表名),默认就是_doc, 1表示这条数据的id号
PUT books/_doc/1 
{
  "title":"大头儿子小偷爸爸",
  "price":100,  
  "addr":"北京天安门",
  "company":{
    "name":"我爱北京天安门",
    "company_addr":"我的家在东北松花江傻姑娘",
    "employee_count":10
  },
  "publish_date":"2019-08-19"
}
#测试数据2
PUT books/_doc/2
{
  "title":"白雪公主和十个小矮人",
  "price":"99", #写字符串会自动转换成int类型
  "addr":"黑暗森里",
  "company":{
    "name":"我的家乡在上海",
    "company_addr":"朋友一生一起走",
    "employee_count":10
  },
  "publish_date":"2018-05-19"
}

#测试数据3  因为是非关系型数据库,可以不考虑字段,测试数据3没有company字段,并且新增了name字段,也能插入进去
PUT books/_doc/3
{
  "title":"白雪公主和十个小矮人",
  "price":"99", #写字符串会自动转换
  "addr":"黑暗森里",
  "publish_date":"2018-05-19"
  |"name":"lqz"   # 注意: 新增的字段有缩进,不然报错
}

 

3 查看映射

#查看books索引的mapping
# 1、创建索引时,如果没有创建映射(创建表)只要插入文档,会自动创建出字段。
# 2、甚至不用创建索引,只要插入文档,会自动创建索引、映射、字段,自动创建索引和映射后不能删除。
GET books/_mapping
#获取所有的mapping
GET _all/_mapping

 

posted @ 2022-12-04 21:21  不会钓鱼的猫  阅读(34)  评论(0编辑  收藏  举报