elasticsearch研习(五)

#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研习(五)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注