Dynamic Mapping 以及Mapping和常见字段类型相关问题

Mapping中的字段一旦设定后,禁止直接修改。因为倒排索引生成后不允许直接修改。需要重新建立新的索引,做reindex操作。
类似数据库中的表结构定义,主要作用
定义索引下的字段名字
定义字段的类型
定义倒排索引相关的配置(是否被索引?采用的Analyzer)
对新增字段的处理
true
false
strict
在object下,支持做dynamic的属性的定义

当dynamic mapping映射时。如果映射不满足我们的需求。能否进行修改映射关系,答案是不能直接修改,除非进行reindex 重建索引

dynamic mapping 就是当我们直接添加新的字段到索引中,此时如果没有指定相对应的映射关系,那么es就会自动通过dynamic mapping 进行映射

#写入文档,查看 Mapping

PUT mapping_test/_doc/1
{
  "firstName":"Chan",
  "lastName": "Jackie",
  "loginDate":"2018-07-24T10:29:48.103Z"
}
###查看 Mapping文件  已经将时间映射为date 名字映射为了 并且type 为text 同时他 额外的提供了
####    "fields" : {
####       "keyword" : {
####         "type" : "keyword",
####         "ignore_above" : 256
####       }
####     }
####  这个字段是当我们对所选字段进行聚合 查询的时候,因为当前字段属于text 类型。所以所对应的索引都会进行分词,这是我们对于整体进行聚合查询时,结果就不够准确。所以此时我们可以通过 字段名.keyword 进行聚合查询,结果就足够的准确
GET mapping_test/_mapping

DELETE mapping_test

#dynamic mapping,推断字段的类型
## 但是dynamic mapping 也会经常有不准确的时候,譬如,下面的uid映射为text ,isadmin 映射为text 而并非integer 或者 Boolean 
PUT mapping_test/_doc/1
{
    "uid" : "123",
    "isVip" : false,
    "isAdmin": "true",
    "age":19,
    "heigh":180
}

默认Mapping 支持dynamic 我们给文档写入新的字段时,会自动映射

PUT mapping_test/_doc/1
{
  "address": "西安"
}

GET mapping_test

默认情况下该字段可以搜索,数据也可以查询返回到_source

POST mapping_test/_search
{
  "query": {
    "match": {
      "address": "西安"
    }
  }
}

可以设置dynamic 为false

PUT mapping_test/_mapping
{
  "dynamic": false
}

当dynamic 为false 的时候 新增不存在的字段,仍然可以成功 但是因为dynamic已经设置为false 所以并不能进行动态的映射,查询映射关系中也不会有该映射 并且该文档也不会被查询到

PUT mapping_test/_doc/3
{
  "cityName": "西安"
}

dynamic 也可以设置为严格的,当设置为严格的时候,默认的字段不能进行添加 自然也不会查询的到

PUT mapping_test/_mapping
{
  "dynamic": "strict"
}

GET mapping_test/_mapping

PUT mapping_test/_doc/3
{
  "cityName": "西安"
} 

#https://www.elastic.co/guide/en/elasticsearch/reference/7.1/dynamic-mapping.html

在这里插入图片描述
控制当前字段是否被索引
在这里插入图片描述
index options
在这里插入图片描述
在这里插入图片描述
null_value
在这里插入图片描述
capy_to设置
在这里插入图片描述

设置index 为false 当设置index 为false 的时候。该字段则不能根据该字段进行索引查询

PUT users
{
    "mappings" : {
      "properties" : {
        "firstName" : {
          "type" : "text"
        },
        "lastName" : {
          "type" : "text"
        },
        "mobile" : {
          "type" : "text",
          "index": false
        }
      }
    }
}

PUT users/_doc/1
{
  "firstName": "张",
  "lastName": "三",
  "mobile": "135711"
}

查询索引可以看到mobile索引已经创建但是index为false

GET users/_mapping

当根据mobile进行索引查询的时候,就会报错

POST /users/_search
{
  "query": {
    "match": {
      "mobile": "135711"
    }
  }
}

设定Null_value

DELETE users

当我们想要对于一些null的数据进行查询的时候,可以在创建索引的时候,设置"null_value": “NULL” 但是只要字段的类型为keyword的时候才能设置null_value

PUT users
{
  "mappings": {
    "properties": {
      "firstName": {
        "type": "text"
      },
      "lastName": {
        "type": "text"
      },
      "mobile": {
        "type": "keyword",
        "null_value": "NULL"
      }
    }
  }
}
## 添加数据
PUT users/_doc/1
{
  "firstName": "张",
  "lastName": "三",
  "mobile": "135711"
} 

添加一条电话号码为null 的数据

PUT users/_doc/3

{
  "firstName": "张",
  "lastName": "三",
  "mobile": null
}

##可以通过mobile字段的NULL 查询出该字段为空值的数据,并且数据结果显示未null而不是字符串
POST users/_search
{
  "query": {
    "match": {
      "mobile": "NULL"
    }
  }
}

设置copy to 在es7版本前 可以通过_all对于所有的字段进行操作 在7版本以后可以通过copy to 进行手动的完成_all功能

已经手动的指定了所有的字段都copy to 到fullName 但是他不会出现在_source中

DELETE users
PUT users
{
  "mappings": {
    "properties": {
      "firstName":{
        "type": "text",
        "copy_to": "fullName"
      },
      "lastName":{
        "type": "text",
        "copy_to": "fullName"
      }
    }
  }
} 

PUT users/_doc/1
{
  "firstName": "张三",
  "lastName": "王五"
}

可以通过url search 进行查询测试

下面的usr search 中q代表进行查询 () 代表将张三王五作为一个整体进行查询 我们的映射中并未有fullName 但是因为进行了copy_to 所以可以查询到指定的数据,当然 _source中也不会返回相应的数据

GET users/_search?q=fullName:(张三王五)

通过matchquery 并指定查询条件的操作方式为and

POST users/_search
{
  "query": {
    "match": {
      "fullName": {
        "query": "张三王五",
        "operator": "and"
      }
    }
  }
}

PUT users/_doc/1
{
  "name": "张三",
  "interests": ["读书","看报"]
}

GET users/_search

dynamic mapping 对于数组的mapping的type是text 而不是数组

GET users/_mapping
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值