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