#elasticsearch映射关系讲解
#文档的字段可以是任意的,原本都是name字段,突然来个age。还要elasticsearch自动去猜,哦,可能是个long类型,然后加个映射!之后发什么什么?肯定是:猜猜猜,猜你妹!
#难道你不想知道elasticsearch内部是怎么玩的吗?
#当我们执行上述第一条PUT命令后,elasticsearch到底是怎么做的
#了解表内到底有哪些内容
PUT t1/doc/1
{
"name": "小黑"
}
GET t1
PUT t1/doc/2
{
"name": "小白",
"age": 18
}
GET t1
#查看两次执行结果的不同
#映射mappings没那么神秘!说白了,就相当于原来由elasticsearch自动帮我们定义表结构。现在,我们要自己来了,旨在创建索引的时候,有更多定制的内容,更加的贴合业务场景。
# 简单类型,如文本(text)、关键字(keyword)、日期(date)、整形(long)、双精度(double)、布尔(boolean)或ip。
# 可以是支持JSON的层次结构性质的类型,如对象或嵌套。
# 或者一种特殊类型,如geo_point、geo_shape或completion
#
# index.mapping.total_fields.limit:索引中的最大字段数。字段和对象映射以及字段别名都计入此限制。默认值为1000。
# index.mapping.depth.limit:字段的最大深度,以内部对象的数量来衡量。例如,如果所有字段都在根对象级别定义,则深度为1.如果有一个子对象映射,则深度为2,等等。默认值为20。
# index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认为50.索引1个包含100个嵌套字段的文档实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档。
DELETE /t1
PUT mapping_test1
{
"mappings": {
"test1":{
"properties":{
"name":{"type": "text"},
"age":{"type":"long"}
}
}
}
}
GET mapping_test1
PUT mapping_test1/test1/1
{
"name":"张开嘴",
"age":16
}
GET mapping_test1/test1/_search
{
"query": {
"match": {
"age": 16
}
}
}
DELETE mapping_test1
#一般的,mapping则又可以分为动态映射(dynamic mapping)和静态(显式)映射(explicit mapping)和精确(严格)映射(strict mappings),具体由dynamic属性控制。
#动态映射(dynamic:true)
PUT m1
{
"mappings": {
"doc":{
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
}
}
}
}
}
#查询映射的mapping信息
GET m1/_mapping
#向文档中添加信息,然后查看映射
PUT m1/doc/1
{
"name": "小黑",
"age": 18,
"sex": "不详"
}
#查询字段
GET m1/doc/_search
{
"query": {
"match": {
"sex": "不详"
}
}
}
#查询映射的mapping信息
GET m1/_mapping
# elasticsearch默认是允许添加新的字段的,也就是dynamic:true
#这里有一点需要注意的是:mappings一旦创建,则无法修改。
#以上就是动态索引
DELETE /m1
#静态索引
#我们主动地在创建mappings的时候设置dynamic为false
PUT m2
{
"mappings": {
"doc":{
"dynamic":false,
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
}
}
}
}
}
PUT m2/doc/1
{
"name": "小黑",
"age":18
}
GET /m2
PUT m2/doc/2
{
"name": "小白",
"age": 16,
"sex": "不详"
}
#于上一次mapping属性还是一致的
GET /m2
#但是执行下面的搜索,却返回的是null
GET m2/doc/_search
{
"query": {
"match": {
"sex": "不详"
}
}
}
#可以看到elasticsearch并没有为新增的sex建立映射关系。所以查询不到。
DELETE /m2
#当elasticsearch察觉到有新增字段时,因为dynamic:false的关系,会忽略该字段,但是仍会存储该字段。
#在有些情况下,dynamic:false依然不够,所以还需要更严谨的策略来进一步做限制。
#严格模式(dynamic:strict)
PUT m3
{
"mappings": {
"doc": {
"dynamic": "strict",
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
}
}
}
}
}
PUT m3/doc/1
{
"name": "小黑",
"age":18
}
GET /m3
#执行下面的问题发现报错了
PUT m3/doc/2
{
"name": "小白",
"age": 16,
"sex": "不详"
}
#错误提示,严格动态映射异常!说人话就是,当dynamic:strict的时候,elasticsearch如果遇到新字段,会抛出异常。
#上述这种严谨的作风洒家称为——严格模式!
DELETE /m3
版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创
转载请注明:出处来自王晨曦个人站点 » elasticsearch研习(五)