注:version:elasticsearch-7.11.2
一.mapping文档映射
文档映射类似关系型数据库中表结构的字段类型、长度等。
ES中映射可以分为动态映射和静态映射。
动态映射:在关系型数据库中表字段类型、长度都是自定义的,而在es中不需要自定义,es会自动识别类型,这种机制就是动态映射。
静态映射:es中也可以为索引事先定义好映射,映射内容包括字段类型、分词器等,这种方式称之为静态映射。
1.添加文档映射
PUT /developer
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"gender": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"remark": {
"type": "text",
"index": true,
"store": true
},
"address": {
"type": "text",
"index": true,
"store": true
}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
添加两条测试数据
PUT /developer/_doc/2
{
"name": "韩梅",
"gender": "0",
"age": 17,
"address": "安徽省合肥市蜀山区",
"remark": "是一个高级程序员",
"nickname": "大梅"
}
PUT /developer/_doc/2
{
"name": "韩梅",
"gender": "0",
"age": 17,
"address": "安徽省合肥市蜀山区",
"remark": "是一个高级程序员,马上可以升级资深程序员",
"nickname": "大梅"
}
2.获取文档映射
GET /developer/_mapping
3.对已有映射进行修改
例如本例中的索引developer,我们要修改该索引,把 address 和 remark 字段改为中文分词器。怎么操作呢
操作步骤:
1.建一个新索引
2.把原索引里的数据导入新索引
3.删除原索引
4.把新索引起个别名,为原索引名
#1.建新索引,address、remark使用中文分词器
PUT /developer2
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"gender": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"remark": {
"type": "text",
"index": true,
"store": true,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"address": {
"type": "text",
"index": true,
"store": true,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
#2.把原索引里的数据导入新索引 source原索引,dest目标索引
POST _reindex
{
"source": {
"index": "developer"
},
"dest": {
"index": "developer2"
}
}
#3.删除原索引
DELETE /developer
#4.把新索引起个别名,为原索引名
PUT /developer2/_alias/developer
查询索引developer可以查到数据
此时elasticsearch-head 已显示developer2的别名为developer
二.核心类型
字符串:包含text和keyword两种。text可分词,不可排序和聚合;keyword不可分词,可排序和聚合。
数值型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
text和keyword的区别
#address_test使用text类型,address_keyword使用keyword类型
PUT /kwtest
{
"mappings": {
"properties": {
"address_test": {
"type": "text",
"index": true,
"store": true,
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"address_keyword": {
"type": "keyword",
"index": true,
"store": true
}
}
}
}
PUT /kwtest/_doc/1
{
"address_test": "浙江省杭州市西湖区",
"address_keyword": "浙江省杭州市西湖区"
}
POST /kwtest/_doc/_search
{
"query": {
"match": {
"address_test": "杭州"
}
}
}
上图看到 address_test是text类型,使用关键字可以查询到结果
上面两张图测试结果:使用address_keyword必须全匹配才能查询结果。因为keyword类型不参与分词。
keyword不参与分词,大小写敏感