一、映射定义
映射,用来定义一个文档及其包含的字段如何存储和索引的过程。我们使用映射来定义:
- 哪些字符串应该被视为全文字段
- 哪些字段包含数字、日期或地理位置
- 定义日期的格式
- 自定义的规则,用来控制动态添加字段的映射
映射类型:
- 元字段-----元字段用于自定义如何处理文档关联的元数据,如包括 文档的_index、_type、_id、_source字段
- 字段或属性-----映射类型包含与文档相关的字段或者属性的列表
字段的数据类型:
- 简单类型----如文本text、关键字keyword、日期date、整型long、双精度double、布尔boolean或ip
- 可以是支持json的层次结构性质的类型,如对象或嵌套
- 特殊类型,如geo_point、geo_shape或completion
映射约束:
在索引中定义大多的字段,有可能导致映射爆炸,导致内存不足以及难以恢复的情况。
为此,我们可以手动或动态的创建字段映射的数量:
- index.mapping.total_fileds.limit:索引中的最大字段数。字段和对象映射以及字段别名都计入此限制,默认为1000
- index.mapping.depth.limit:字段的最大深度,以内部对象的数量来衡量。默认为20
- index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认为50。索引1个包含100个嵌套字段的文档,实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档。
二、映射示例
设置映射:
PUT s2
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"desc": {
"type": "text"
}
}
}
}
}
查询映射的设置:
GET s18/_mapping
{
"s18" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"b" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"sex" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
插入数据
put s2/doc/1
{
"name": "zining",
"age": 32,
"desc": "低调"
}
注意:
dynamic默认为true。可以新增,可以作为主查询字段。
为flase时。可以新增,但不可以作为主查询字段,但可以作为辅助查询字段。
为strict时。不可以新增。
三、映射其它设置
ignore_above:超过ignore_above的字段,不会被索引,当然也会查询不到。
对于字符串数组,ignore_above将分别应用于每个数组元素,并且超过字段串元素ignore_above将不会将索引或存储。
index:index为true,此字段将创建索引,可以作为主查询条件。当为false,此字段将不会被创建索引,不可以作为主查询条件。
put s8
{
"mappings": {
"doc": {
"properties": {
"t1": {
"type": "text",
"index": true
}
"t2": {
"type": "text",
"index": false
}
}
}
}
}
PUT s8/doc/1
{
"t1": "abcddef",
"t2": "asdfasdf"
}
GET s8/doc/_search
{
"query": {
"t1": "abcddef"
}
}
copy_to:
PUT s9
{
"mappings": {
"doc": {
"properties": {
"t1": {
"type": "text",
"copy_to": "full_name"
},
"t2": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
}
PUT s9/doc/1
{
"t1": "x"
"t2": "y"
}
GET s9/doc/1
{
"query": {
"match": {
"full_name": "x"
}
}
}
PUT s9
{
"mappings": {
"doc": {
"properties": {
"t1": {
"type": "text",
"copy_to": ["f1", "f2"]
},
"t2": {
"type": "text",
"copy_to": ["f1", "f2"]
},
"f1": {
"type": "text"
},
"f2": {
"type": "text"
}
}
}
}
}
嵌套类型:
PUT w1
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"info": {
"properties": {
"addr": {
"type": "text"
},
"tel": {
"type": "long"
}
}
}
}
}
}
}
PUT w1/doc/1
{
"name": "jerry",
"age": 78,
"info": {
"addr": "bj",
"tel": "2342"
}
}
GET w1/doc/_search
{
"query": {
"match": {
"info.tel": "2342"
}
}
}
设置mapping的同时,设置settings
settings设置主分片、复制分片示例:
PUT w2
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"index": true
},
"age": {
"type": "long",
"ignore_above": 128
},
"desc": {
"type": "keyword",
"ignore_above": 128,
"copy_to": ["t1", "t2"]
},
"tags": {
"type": "keyword",
"index": false,
"copy_to": ["t1", "t2"]
},
"info": {
"properties": {
"addr": {
"type": "text"
},
"tel": {
"type": "long"
}
}
},
"t1": {
"type": "text"
},
"t2": {
"type": "text"
}
}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 3
}
}