问题
- 什么是index mapping?
- mapping 有什么用?
- 如何设置mapping?
- 如何动态设置mapping?
1.什么是Index mapping
个人理解类似于MySQL字段的定义,可以定义是什么类型,但是Es作为一个索引中间件,肯定支持中文分词等一些其他特性
官网理解:
mapping可以定义文档字段:
- 哪些字符串应该被当做全文字段
- 这些字段分别是什么类型
- 这些字段是否索引到catch-all字段中
- 可以格式化某些value
- 自定义规则去mapping 动态添加的字段
官网和我理解不相上下!
2.mapping 有什么用?
ES mapping 就是对索引中的字段做一些声明。比如字符串用什么分词器,索引用不用分词等约束
3.如何设置mapping?
创建一个索引:
curl -XPOST "http://127.0.0.1:9200/test-mapping"
假设索引type为doc,创建mapping:
curl -XPUT http://localhost:9200/test-mapping/doc/_mapping -d '
{
"doc": {
"_source": {
"enabled": true
},
"_all": {
"enabled": false
},
"properties": {
"uuid": {
"type": "keyword"
},
"username": {
"type": "text"
},
"password": {
"type": "text"
},
"device_id": {
"type": "keyword"
},
"user_id": {
"type": "keyword"
}
}
}
}
'
4.如何动态设置mapping?
比如有多个index,名字为 teiba_1, tieba_2这样我们就会做很多重复的工作去为每一个index创建mapping,当然ES帮我们想到了这一点,可以设置一个模板,然后相同类型(正则匹配上)的Index就可以应用相同的mapping
curl -XPUT http://localhost:9200/_template/tieba_template -d '
{
"order": 1,
"template": "tieba*",
"mappings": {
"_default_": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
'
创建两个index: tieba1 tieba2
curl -XPOST http://localhost:9200/tieba1
curl -XPOST http://localhost:9200/tieba2
然后查看这2个index的mapping
可以看到这2个index都成功应用了这个template的mapping
总结
- mapping 作用就是定义字段类型,以及分词器,格式化之类的约束
- 通过设置templte可以动态为index设置mapping